sql - 我可以在另一个 listagg 查询的 where 子句中使用一个 listagg 查询的输出吗

标签 sql oracle plsql

我用 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/

相关文章:

plsql - 定义包内的过程

sql - 列不存在,pgAdmin 4

SQLite查询返回 "syntax error Unable to execute statement"

Java 日历/日期转 SQL 时间戳/Oracle 数据库

sql - PL/SQL - 如何从连接表中返回单行

sql - 使用 PL/SQL 解析 XML 时跳过重复值

hibernate - BigDecimal 0.000 到 0

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql - 为什么在 where 子句中使用相关查询进行查询时结果集中没有相似的 id

Oracle:将数字转换为英语以外的其他语言的单词