Как использовать значения, разделенные запятыми, из 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    |
-----------------

Но фактический результат не возвращает никаких строк, поскольку он рассматривает подзапрос как одно поле.

Как с этим можно справиться?


person Rishi Deorukhkar    schedule 17.06.2016    source источник
comment
или это: stackoverflow.com/questions/18770581/   -  person Florin Ghita    schedule 17.06.2016


Ответы (1)


Выходные данные аналитической функции 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;
/
person Rachcha    schedule 17.06.2016