sql中的xmlagg函数有什么方法可以使用DISTINCT吗?

Is there any way to use DISTINCT in xmlagg function in sql?

我使用了以下命令。

select col1, col2, XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()')
from table
group by col1, col2

输出:

col1      col2      col3

KOCHI   ERNAKULAM   residential, commercial, residential, residential

但我需要以下输出作为

col3 :

residential, commercial.

我尝试在子查询中使用 DISTINCT,但没有获得所需的输出。有帮助吗?

您可以在子查询中使用distinct,如下所示:

select col1, col2, XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()')
from (select distinct col1, col2, colname from table)
group by col1, col2

首先 select 个不同的值,然后应用 XMLAGG,例如

select col1, col2, XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()')
from (select distinct col1, col2, colname
      from table 
     )
group by col1, col2

不过,如果生成的字符串不超过 4000 个字符,请考虑使用 LISTAGG:

select col1, col2, LISTAGG(colname, ',')) within group (order by null)
from (select distinct col1, col2, colname
      from table 
     )
group by col1, col2

虽然带有 DISTINCT 的子查询在这种情况下有效,但它不是一个通用的解决方案。它可能会干扰您可能希望包含在查询中的其他列。

XMLAGG() 忽略 NULL 值。所以更通用的方法是使用 ROW_NUMBER():

select col1, col2,
       XMLAGG(CASE WHEN SEQNUM. = 1 THEN XMLELEMENT(E, colname || ',') END).EXTRACT('//text()')
from (select t.*,
             ROW_NUMBER() OVER (PARTITION BY col1, col2, colname ORDER BY colname) as seqnum
      from t
     ) t
group by col1, col2

使用regexp_replace功能怎么样?例如

select
col1,
col2,
regexp_replace(XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()'),'([^,]+)(,)+', '') as colname_list
from table
group by col1, col2