我用 listagg
编写了一个查询,如下所示
DECLARE
v_data VARCHAR2 (100);
v_data2 VARCHAR2 (100);
BEGIN
SELECT LISTAGG (data1, ',') WITHIN GROUP (ORDER BY data1)
INTO v_data
FROM table1
WHERE data1 IN (1, 2, 3);
DBMS_OUTPUT.put_line (v_data);
SELECT LISTAGG (data2, ',') WITHIN GROUP (ORDER BY data2)
INTO v_data2
FROM table1
WHERE data1 IN (v_data);
DBMS_OUTPUT.put_line (v_data2);
END;
我可以在另一个 listagg
查询的 where
子句中使用一个 listagg
查询的输出吗?
v_data 的输出是 1,2,3
,所以我想在第二个查询中使用它,例如 where data in (v_data)
即 where data在(1,2,3)
与上面的 block 一样,我得到了 v_data 的输出,但没有得到 v_data2 的输出。
最佳答案
基本上,您应该将V_DATA
逗号分隔值拆分为行。
这是一个基于 Scott 架构的示例:
SQL> DECLARE
2 v_data VARCHAR2 (100);
3 v_data2 VARCHAR2 (100);
4 BEGIN
5 SELECT LISTAGG (deptno, ',') WITHIN GROUP (ORDER BY deptno)
6 INTO v_data
7 FROM dept
8 WHERE deptno IN (10, 20, 30);
9
10 DBMS_OUTPUT.put_line (v_data);
11
12 SELECT LISTAGG (ename, ',') WITHIN GROUP (ORDER BY deptno)
13 INTO v_data2
14 FROM emp
15 WHERE deptno IN (select regexp_substr(v_data, '[^,]+', 1, level)
16 from dual
17 connect by level <= regexp_count(v_data, ',') + 1
18 );
19
20 DBMS_OUTPUT.put_line (v_data2);
21 END;
22 /
10,20,30
CLARK,KING,MILLER,ADAMS,FORD,JONES,SCOTT,SMITH,ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
PL/SQL procedure successfully completed.
SQL>
关于sql - 我可以在另一个 listagg 查询的 where 子句中使用一个 listagg 查询的输出吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51318361/