DB2逗号分隔输出

gau*_*rav 18 sql db2

如何在DB2中的sql中获取逗号分隔列值的内置函数,例如,如果存在具有此策略ID的列,并且它具有3行具有相同id但在三行中具有三个不同角色,那么它应该在一行中检索行排"3,4,5"

例如

ID   | Role
------------
4555 | 2
4555 | 3
4555 | 4
Run Code Online (Sandbox Code Playgroud)

DB2 SQLDB2中的输出在一行中

小智 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)


boe*_*oes 9

根据您拥有的DB​​2版本,您可以使用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)

  • 这是mysql不是db2 (2认同)