如何在DB2中的sql中获取逗号分隔列值的内置函数,例如,如果存在具有此策略ID的列,并且它具有3行具有相同id但在三行中具有三个不同角色,那么它应该在一行中检索行排"3,4,5"
例如
ID | Role
------------
4555 | 2
4555 | 3
4555 | 4
Run Code Online (Sandbox Code Playgroud)
DB2 SQL
DB2中的输出在一行中
小智 38
LISTAGG函数是DB2 LUW 9.7中的新函数
看例子:
create table myTable (id int, category int);
insert into myTable values (1, 1);
insert into myTable values (2, 2);
insert into myTable values (5, 1);
insert into myTable values (3, 1);
insert into myTable values (4, 2);
Run Code Online (Sandbox Code Playgroud)
示例:在分组列中选择没有任何顺序
select category, LISTAGG(id, ', ') as ids from myTable group by category;
Run Code Online (Sandbox Code Playgroud)
结果:
CATEGORY IDS
--------- -----
1 1, 5, 3
2 2, 4
Run Code Online (Sandbox Code Playgroud)
示例:在分组列中使用order by子句进行选择
select
category,
LISTAGG(id, ', ') WITHIN GROUP(ORDER BY id ASC) as ids
from myTable
group by category;
Run Code Online (Sandbox Code Playgroud)
结果:
CATEGORY IDS
--------- -----
1 1, 3, 5
2 2, 4
Run Code Online (Sandbox Code Playgroud)
Nic*_*tou 10
我认为通过这个较小的查询,你可以做你想要的.这相当于DB2中的MySQL的GROUP_CONCAT.
SELECT
NUM,
SUBSTR(xmlserialize(xmlagg(xmltext(CONCAT( ', ',ROLES))) as VARCHAR(1024)), 3) as ROLES
FROM mytable
GROUP BY NUM;
Run Code Online (Sandbox Code Playgroud)
这将输出如下内容:
NUM ROLES
---- -------------
1 111, 333, 555
2 222, 444
Run Code Online (Sandbox Code Playgroud)
假设你的原始结果是这样的:
NUM ROLES
---- ---------
1 111
2 222
1 333
2 444
1 555
Run Code Online (Sandbox Code Playgroud)
根据您拥有的DB2版本,您可以使用XML函数来实现此目的.
包含一些数据的示例表
create table myTable (id int, category int);
insert into myTable values (1, 1);
insert into myTable values (2, 2);
insert into myTable values (3, 1);
insert into myTable values (4, 2);
insert into myTable values (5, 1);
Run Code Online (Sandbox Code Playgroud)
使用xml函数聚合结果
select category,
xmlserialize(XMLAGG(XMLELEMENT(NAME "x", id) ) as varchar(1000)) as ids
from myTable
group by category;
Run Code Online (Sandbox Code Playgroud)
结果:
CATEGORY IDS
-------- ------------------------
1 <x>1</x><x>3</x><x>5</x>
2 <x>2</x><x>4</x>
Run Code Online (Sandbox Code Playgroud)
使用replace可以使结果看起来更好
select category,
replace(
replace(
replace(
xmlserialize(XMLAGG(XMLELEMENT(NAME "x", id) ) as varchar(1000))
, '</x><x>', ',')
, '<x>', '')
, '</x>', '') as ids
from myTable
group by category;
Run Code Online (Sandbox Code Playgroud)
清理结果
CATEGORY IDS
-------- -----
1 1,3,5
2 2,4
Run Code Online (Sandbox Code Playgroud)
刚看到使用XMLELEMENT的XMLTEXT而不是一个更好的解决方案在这里.
Sam*_*sil -2
尝试这个:
SELECT GROUP_CONCAT( field1, field2, field3 ,field4 SEPARATOR ', ')
Run Code Online (Sandbox Code Playgroud)