Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
值大于1的单元格的嵌套SQL IN语句_Sql_Oracle_Listagg - Fatal编程技术网

值大于1的单元格的嵌套SQL IN语句

值大于1的单元格的嵌套SQL IN语句,sql,oracle,listagg,Sql,Oracle,Listagg,如何编写SQL,使其返回给我 汤姆,肯,杰瑞 我尝试了这个SQL作为 select name from staffDB where dept in (select value from ConfigDB where key = 'dept') 但是它不返回值,不,不,我不允许更改数据库设计。您的数据库设计不是最佳的,因为它存储的是CSV值。也就是说,这里有一种使用LISTAGG 11g+获得所需输出的方法: 请注意

如何编写SQL,使其返回给我

汤姆,肯,杰瑞

我尝试了这个SQL作为

select name
  from staffDB
 where dept in (select value 
                  from ConfigDB 
                 where key = 'dept')

但是它不返回值,不,不,我不允许更改数据库设计。

您的数据库设计不是最佳的,因为它存储的是CSV值。也就是说,这里有一种使用LISTAGG 11g+获得所需输出的方法:

请注意,我们使用以下逻辑将配置表中的部门CSV列表与staff表中的每个标量值进行比较,例如:

,A,B,C, LIKE '%,A,%'

也就是说,我们在CSV部门字符串上标记逗号,这样我们可以搜索每个可能的标量部门,每个部门都用逗号括起来。

一个选项是用逗号拆分,然后在SELECT中使用LISTAGG函数进行合并。。按级别连接。。声明:

WITH ConfigDB( key, value ) AS
(
 SELECT 'dept', 'A,B,C' FROM dual
), StaffDB( name, dept ) AS
(
 SELECT 'tom'  , 'A' FROM dual UNION ALL
 SELECT 'ken'  , 'B' FROM dual UNION ALL
 SELECT 'jerry', 'C' FROM dual  
), t AS
(
 SELECT REGEXP_SUBSTR(value,'[^,]',1,level) AS letter, level AS lvl
   FROM ConfigDB
  CONNECT BY level <= REGEXP_COUNT(value,',') + 1
)
SELECT LISTAGG(name,',') WITHIN GROUP (ORDER BY lvl) AS DBNAme
  FROM t  
  JOIN StaffDB
    ON dept = letter

请使用下面的查询

select * from 
(select LISTAGG(Name, ',') WITHIN GROUP (ORDER BY Dept) as name, 
LISTAGG(Dept, ',') WITHIN GROUP (ORDER BY Dept) as dept from staffDB)
where dept  in
(select value from ConfigDB);
下面是测试用例


您可以使用层次结构查询拆分该值,然后按如下方式将其合并:

SQL>  SELECT
2      C.KEY,
3      LISTAGG(S.NAME, ',') WITHIN GROUP(ORDER BY S.DEPT) DEPARTMENTS
4     FROM
5      CONFIGDB   C
6      CROSS JOIN TABLE ( CAST(MULTISET(
7          SELECT REGEXP_SUBSTR(C.VALUE, '[^,]+', 1, LEVEL)
8            FROM DUAL
9          CONNECT BY LEVEL <= REGEXP_COUNT(C.VALUE, '[^,]+')
10      ) AS SYS.ODCIVARCHAR2LIST) ) C1
11      LEFT JOIN STAFFDB    S ON S.DEPT = C1.COLUMN_VALUE
12    GROUP BY C.KEY;

KEY   DEPARTMENTS
----- ---------------
dept  tom,ken,jerry

SQL>
SQL>  SELECT
2      C.KEY,
3      LISTAGG(S.NAME, ',') WITHIN GROUP(ORDER BY S.DEPT) DEPARTMENTS
4     FROM
5      CONFIGDB   C
6      CROSS JOIN TABLE ( CAST(MULTISET(
7          SELECT REGEXP_SUBSTR(C.VALUE, '[^,]+', 1, LEVEL)
8            FROM DUAL
9          CONNECT BY LEVEL <= REGEXP_COUNT(C.VALUE, '[^,]+')
10      ) AS SYS.ODCIVARCHAR2LIST) ) C1
11      LEFT JOIN STAFFDB    S ON S.DEPT = C1.COLUMN_VALUE
12    GROUP BY C.KEY;

KEY   DEPARTMENTS
----- ---------------
dept  tom,ken,jerry

SQL>