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
我使用了以下命令。
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