2016-06-17 27 views
0

考虑查询如何在内部查询中使用来自listagg的逗号分隔值?

select listagg(''''||Name||'''', ',') within group (order by Name) from STUDENTS; 

这给了我输出

'Jon','Rob','Bran' 

如何使用这个在内部查询请看下面的例子:

with lst as(
select listagg(''''||Name||'''', ',') within group (order by Name) as name_list from STUDENTS) 
select * from result where Name in (select name_list from lst) 

预期结果:

----------------- 
| Name | Score | 
----------------- 
| Jon | 80 | 
----------------- 
| Rob | 60 | 
----------------- 
| Bran | 75 | 
----------------- 

但是实际结果不会返回任何行,因为它将子查询视为单个字段。

这怎么处理?

+0

或者这个:http://stackoverflow.com/questions/18770581/oracle-分割多逗号分隔值合oracle的表到多行 –

回答

0

listagg解析函数的输出是文本数据。因此,即使你认为你正在

'Jon','Rob','Bran' 

的输出,它实际上是像

'''Jon'', ''Rob'', ''Bran''' 

你的目的由@artm答案应该足够了一个字符串。否则,如果你一定要做你想做的事情,那么你将需要使用像这样的动态SQL:

declare 
    p_cur sys_refcursor; 
    name_list clob; 
    select_sql clob; 
begin 
    select listagg(''''||Name||'''', ',') 
       within group (order by Name) as name_list 
     into name_list 
     from STUDENTS; 

    select_sql := 'select * from result where name in (' || name_list || ')'; 

    open p_cur for select_sql; 
end; 
/