SQL 将行连接成一个字段 (DB​​2)

Posted

技术标签:

【中文标题】SQL 将行连接成一个字段 (DB​​2)【英文标题】:SQL concatenate rows into one field (DB2) 【发布时间】:2017-12-01 23:20:23 【问题描述】:

我需要从我的 DB2 数据库中提取一些数据。我在一个表中有关键字,每个关键字都是单独的行。在摘录中,我希望将所有 ID 的所有关键字放在一个用逗号分隔的字符串中。

所以,解释一下: 我有这样的数据

ID         | keyword 
===========================
prd1       | test
---------------------------
prd2       | keywords
---------------------------
prd1       | flower
---------------------------
prd4       | picture
---------------------------
prd7       | 234567
---------------------------
prd9       | reored
---------------------------
prd4       | finland
---------------------------
prd0       | 983y23
---------------------------
prd4       | code
---------------------------
prd9       | tratata

这是我想要实现的示例:

ID         | keyword concatenated
===========================
prd1       | test, flower
---------------------------
prd2       | keywords
---------------------------
prd4       | picture, finland, code
---------------------------
prd7       | 234567
---------------------------
prd9       | reored, tratata
---------------------------
prd0       | 983y23
---------------------------

我试过concat

SELECT concat(keyword) FROM table.keywordTbl

我尝试了一些 DB2 特定的命令:

SELECT IDs, Sys_Connect_By_Path(varchar(keyword), ', ') AS "keyword concatenated" FROM table.keywordTbl START WITH ID='prd1' CONNECT BY ID=keyword

PIVOT 不适合这个,但我也检查过。 GROUP_CONCAT 也不起作用。

当然,这些都不起作用...

你有什么提示吗?

【问题讨论】:

【参考方案1】:

如果你有DB2 v9.7+,你也可以使用LISTAGG()函数。第一个参数是列,第二个是分隔符。

SELECT 
  ID
, LISTAGG(keyword, ',') AS "keyword concatenated"
    FROM table.keywordTbl 
GROUP BY ID

【讨论】:

这非常有效!如果想要连接删除重复项,则可以添加此功能,可以将 Distinct 传递给 ListAgg。 ,LISTAGG(Distinct keyword, ',') as "keyword concatenated"【参考方案2】:

尝试根据以下脚本修改查询

 SELECT 
    ID, 
    SUBSTR(xmlserialize(xmlagg(xmltext(CONCAT( ', ',keyword))) as VARCHAR(1024)), 3) AS "keyword concatenated"
    FROM table.keywordTbl 
    GROUP BY ID

【讨论】:

以上是关于SQL 将行连接成一个字段 (DB​​2)的主要内容,如果未能解决你的问题,请参考以下文章

访问将行连接成单行:需要额外的条件

使用多个连接将行连接成字符串时遇到问题

sql server 使用外连接结果转换成表格式

Oracle查询出两个字段连接成一个字段..中间有符号隔开

将行转换为列的 MS SQL 连接查询

将行从一个表插入到另一个表中,哪个 sql 更有效(外连接 vs 顺序扫描)