LISTAGG 去重处理

ORACLE 11gr 以上WM_CONCAT失效,无奈使用函数 listagg

select listagg(NAME) WITHIN GROUP (ORDER BY NAME) from ENTITY;

然后发现查询的结果, 没有去重,本以为可以简单的用DISTINCT来解决, 没想到, listagg 不支持该关键字。

查了许久资料,从stackoverflow发现可以用正则来处理去重,于是尝试使用

select regexp_replace(listagg(NAME) WITHIN GROUP (ORDER BY NAME),'([^,]+)(,\1)*(,|$)', '\1\3') from ENTITY;

测试得到的结果的确是进行了去重处理。

但是,这个去重,必须建立在排序的基础上,如果listagg拼接出来的数值像

a, b, a, c

这时候,该正则就会失效。

参考链接

https://stackoverflow.com/questions/11510870/listagg-in-oracle-to-return-distinct-values/11511203#11511203

posted @ 2020-07-07 19:52  周末宅2天  阅读(5906)  评论(1编辑  收藏  举报