PL/SQL-选择列值作为字符串数组
我不确定以前是否有人问过这个问题。我也不知道该怎么说。但我会用一个场景来解释。PL/SQL-选择列值作为字符串数组,sql,oracle,stored-procedures,select-query,tablecolumn,Sql,Oracle,Stored Procedures,Select Query,Tablecolumn,我不确定以前是否有人问过这个问题。我也不知道该怎么说。但我会用一个场景来解释。 我有以下表格 带列的选项卡1:用户ID、代码、国家/地区 带列的选项卡2:用户ID、代码、电子邮件 示例内容: TAB1: RISHI, A1B2C3, INDIA RISHI, D2E3F4, INDIA KANTA, G3H4I5, INDONESIA TAB2: RISHI, A1B2C3, rishi1@test.com RISHI, A1B2C3, rishi2@test.com RISHI, A1B2C
我有以下表格
带列的选项卡1:用户ID、代码、国家/地区
带列的选项卡2:用户ID、代码、电子邮件 示例内容:
TAB1:
RISHI, A1B2C3, INDIA
RISHI, D2E3F4, INDIA
KANTA, G3H4I5, INDONESIA
TAB2:
RISHI, A1B2C3, rishi1@test.com
RISHI, A1B2C3, rishi2@test.com
RISHI, A1B2C3, rishi3@test.com
RISHI, D2E3F4, rishi1@test.com
RISHI, D2E3F4, rishi2@test.com
KANTA, G3H4I5, kanta1@test.com
我希望从select查询或pl/sql存储过程得到如下结果:
RISHI, INDIA, A1B2C3, (rishi1@test.com, rishi2@test.com, rishi3@test.com)
RISHI, INDIA, D2E3F4, (rishi1@test.com, rishi2@test.com)
如果我做了如下选择:
select a.userid, a.code, a.country, b.email
from tab1.a, tab2.b
where a.userid = b.userid
and a.code = b.code
and a.userid = 'RISHI';
我得到的结果如下:
RISHI, INDIA, A1B2C3, rishi1@test.com
RISHI, INDIA, A1B2C3, rishi2@test.com
RISHI, INDIA, A1B2C3, rishi3@test.com
RISHI, INDIA, D2E3F4, rishi1@test.com
RISHI, INDIA, D2E3F4, rishi2@test.com
我基本上需要的是将电子邮件ID组合成一个数组。假设TAB1包含更多我实际需要的列,但在本例中我省略了这些列,但是TAB2只有这三列。我认为您希望在MySQL中使用
GROUP\u CONCAT
聚合函数。坏消息是Oracle没有用于组合并的内置功能,好消息是您可以模拟这样的功能
请看这个片段:
with data
as
(
select job,
ename,
row_number() over (partition by job order by ename) rn,
count(*) over (partition by job) cnt
from emp
)
select job, ltrim(sys_connect_by_path(ename,','),',') scbp
from data
where rn = cnt
start with rn = 1
connect by prior job = job and prior rn = rn-1
order by job
而且还会回来
JOB SCBP
--------- ----------------------------------------
ANALYST FORD,SCOTT
CLERK ADAMS,JAMES,MILLER,SMITH
MANAGER BLAKE,CLARK,JONES
PRESIDENT KING
SALESMAN ALLEN,MARTIN,TURNER,WARD
我们发现这只在Oracle 11g第2版中可用,我们使用的是第1版。谢天谢地,我的要求已经改变了,我不再需要这个了。但这是一件非常有用的事情。谢谢
select a.userid, a.code, a.country, listagg(b.email, ',') within group (order by b.email) as "Emails"
from tab1.a, tab2.b
where a.userid = b.userid
and a.code = b.code
and a.userid = 'RISHI'
group by a.userid, a.code, a.country;