Oracle:将唯一的行值合并为逗号分隔的字符串

时间:2014-08-29 07:01:10

标签: sql oracle10g

我有一个返回如下数据的查询,需要将值列组合成逗号分隔的字符串,不包括重复项和空值。

g_name    g_id      v_data    
-----     ----      ------
Test      123        ABC
Test      123        ABC
Test      123        DEG
Test      123        None
Test      123        
Test      123        HIJ

期望的输出:

g_name    g_id      v_data    
-----     ----      ------
Test      123        ABC,DEG,HIJ

我尝试过使用XMLAGG,但无法删除重复项和空值。

select g_name,
     g_id,
     RTRIM(XMLAGG(XMLELEMENT(e, v_data || ',')).EXTRACT('//text()'), ',')
from tblData
group by g_name, g_id

2 个答案:

答案 0 :(得分:1)

只需使用公用表表达式预过滤行,然后执行字符串连接。

with cte1 as (
    select distinct *
    from tblData
    where v_data is not null
)
select g_name,
    g_id,
    RTRIM(XMLAGG(XMLELEMENT(e, v_data || ',')).EXTRACT('//text()'), ',')
from cte1
group by g_name, g_id

答案 1 :(得分:0)

您可以使用LISTAGG功能:

select g_name, g_id, listagg(v_data,',') within group (order by v_data) v_data
from (
  select distinct g_name, g_id, v_data
  from tblData
  where v_data is not null
)
group by g_name, g_id

在内部选择中,我们会处理DISTINCTNULL删除(如果您愿意,也可以在此处删除None。)
外部查询处理按名称和ID分组并连接值