2014-08-29 71 views
0

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

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 

回答

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 
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分组,并连接值

+0

LISTAGG仅适用于Oracle 11g,而使用Oracle 10g即时通讯:( – Ianthe 2014-08-29 08:04:22