2016-06-17 16 views
0

Betrachten Sie die AbfrageWie verwendet man kommagetrennte Werte von listagg in der inneren Abfrage?

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

Diese mir Ausgabe als

'Jon','Rob','Bran' 

gibt Wie verwende ich diese in innere Abfrage folgendes Beispiel:

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) 

Erwartetes Ergebnis:

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

Das tatsächliche Ergebnis gibt jedoch keine Zeilen zurück, da die Unterabfrage als einzelnes Feld betrachtet wird.

Wie kann das gehandhabt werden?

+0

oder diese: http://stackoverflow.com/questions/18770581/oracle- split-multiple-comma-separated-values-in-oracle-table-zu-mehreren-rows –

Antwort

0

Die Ausgabe einer analytischen Funktion listagg ist Textdaten. So, auch wenn Sie denken, dass Sie

'Jon','Rob','Bran' 

als die Ausgabe bekommen, es ist eigentlich eine einzelne Zeichenfolge wie

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

für Ihre Zwecke die Antwort von @artm sollte ausreichen. Andernfalls, wenn Sie sind verpflichtet, zu tun, was Sie versuchen zu tun, dann müssen Sie dynamische SQL wie folgt verwenden:

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; 
/