Oracle SQL如何依据另一列的值拼接同列的多个查询结果?
Oracle SQL指定条件字段拼接查询方案
方案1:LISTAGG函数(Oracle 11gR2及以上版本推荐)
LISTAGG是Oracle官方提供的字符串聚合函数,性能稳定、语法清晰,适合绝大多数场景:
SELECT LISTAGG(B, ';') WITHIN GROUP (ORDER BY NULL) AS result FROM 你的表名 WHERE A = 1;
说明:
WITHIN GROUP后的ORDER BY子句用于指定拼接时的字段顺序,如果你需要按照特定规则排序(如B字段的字典序、表内原始插入顺序等),可将NULL替换为对应排序规则,例如ORDER BY B即可按B字段字母顺序拼接。
方案2:XMLAGG函数(拼接结果超长场景推荐)
如果拼接后的总长度超过4000字节,LISTAGG会抛出长度溢出错误,此时可以使用支持CLOB类型输出的XMLAGG方案:
SELECT RTRIM(XMLAGG(XMLELEMENT(e, B, ';').EXTRACT('//text()') ORDER BY NULL).GETCLOBVAL(), ';') AS result FROM 你的表名 WHERE A = 1;
方案3:WM_CONCAT函数(低版本兼容方案,不推荐生产使用)
Oracle 11gR2之前的版本没有公开的LISTAGG函数,可以使用未官方公开的WM_CONCAT函数实现,默认分隔符为逗号,需要手动替换为分号:
SELECT REPLACE(WM_CONCAT(B), ',', ';') AS result FROM 你的表名 WHERE A = 1;
注意:WM_CONCAT属于Oracle未公开的内部函数,官方不承诺版本兼容性,生产环境尽量优先使用前两种方案。
内容的提问来源于stack exchange,提问作者Jyothsna M
相关产品推荐
相关产品推荐

