SQL子句在case子句中相关

Tyu*_*yug 6 sql db2

是否可以在if语句的case子句中编写子查询

即.

SELECT colA, colB,  
CASE WHEN (SELECT colA FROM tab2 WHERE tab2.colA = tab1.colA) THEN '1'  
CASE WHEN (SELECT colA FROM tab3 WHERE tab3.colA = tab3.colA) THEN '2'  
ELSE '0'  
END AS colC,  
...  
FROM tab1
Run Code Online (Sandbox Code Playgroud)

扩展问题:
是否可以根据该值列执行某些操作?(非常肯定是的,但想要确认)
即.

CASE  
WHEN colC = '1' THEN ( select colR FROM...),  
WHEN colC = '2' THEN (SELECT ColS FROM...),  
ELSE 'doesn't work'  
END AS colD
Run Code Online (Sandbox Code Playgroud)

此外,上述情况是否允许根据colC的值返回多个不同的列?
即.

CASE  
WHEN colC = '1' THEN ( select colR, colV, colX FROM...),  
WHEN colC = '2' THEN (SELECT ColS, ColD FROM...),  
ELSE 'doesn't work'  
END AS colD
Run Code Online (Sandbox Code Playgroud)

谢谢!

one*_*hen 5

是否可以在 case 子句中为 when 语句编写子查询

我想这就是你要问的:

SELECT colA, colB,
       CASE 
          WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
             THEN '1'
          WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
             THEN '2'
          ELSE '0'
       END AS colC
  FROM tab1;
Run Code Online (Sandbox Code Playgroud)

是否可以根据该值列执行某些操作?

您可以这样做,它在第二个CASE表达式中使用 colA 而不是 colC :

SELECT colA, colB,
       CASE 
          WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
             THEN '1'
          WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
             THEN '2'
          ELSE '0'
       END AS colC, 
       CASE 
          WHEN colA = '1' THEN (SELECT colA FROM tab2)
          WHEN colA = '2' THEN (SELECT colB FROM tab3)
          ELSE 'doesn''t work'
       END AS colD
  FROM tab1;
Run Code Online (Sandbox Code Playgroud)

[请注意,将第二个CASE表达式的结果转换为通用数据类型时需要小心,大概是VARCHAR考虑到“不”的默认值。]

但是,我认为您是在问是否可以“重用”CASE同一SELECT子句中表达式的结果,在本例中为 colC。答案是否定的,因为相关名称不在范围内**。你当然可以把它包在一个子查询(或者CTEVIEW等):

SELECT DT1.colA, DT1.colB, DT1.colC, 
       CASE 
          WHEN DT1.colC = '1' THEN (SELECT colA FROM tab2)
          WHEN DT1.colC = '2' THEN (SELECT colB FROM tab3)
          ELSE 'doesn''t work'
       END AS colD
  FROM (       
        SELECT colA, colB,
               CASE 
                  WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA) 
                     THEN '1'
                  WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA) 
                     THEN '2'
                  ELSE '0'
               END AS colC
          FROM tab1
       ) AS DT1;
Run Code Online (Sandbox Code Playgroud)

笔记

** 我的知识基于标准 SQL 而不是 db2。例如,MS Access 允许您以SELECT从右到左的方式在同一子句中使用列相关名称,但这只是确认 Access 没有实现 SQL 语言!


上述情况是否允许根据 colC 的值返回多个不同的列

不同的列是,多列不是。想一想:CASE表达式返回一个值,那么两列的值是什么数据类型?表、列表、数组等?标量值是 1NF 的要求。