SQL子句在case子句中相关

时间:2010-07-01 20:30:33

标签: 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

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

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

此外,上述情况是否允许返回多个不同的列,具体取决于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

谢谢!

3 个答案:

答案 0 :(得分:4)

  

是否可以编写子查询   在一个案例条款中的时间   声明

我认为这就是你要求的:

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;

  

是否有可能做某事   在那个值列?

你可以这样做,在第二个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;

[注意,您需要注意将第二个CASE表达式的结果转换为公共数据类型,大概是VARCHAR,考虑到“不起作用”的默认值。] < / p>

但是,我想你是否可以在同一个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;

请注意

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


  

是允许返回的上述情况   多个不同的列   取决于colC的值

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

答案 1 :(得分:2)

Case语句计算为单个值,因此您无法从它们返回多个列。您可以在Where子句中使用相关子查询,但是您没有显示尝试使用该子查询的示例。 colC是否适用于Where子句将取决于您的数据库引擎。我和其他人一起工作,还有其他人要求你在Where子句中重新运行子查询。

答案 2 :(得分:1)

  

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

是。正如g.d.d.c回答的那样,它必须是一个返回单个值的子查询。这意味着零行或一行,一列或一个值。

  

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

是的,与上述相同。

  

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

没有。子查询必须返回零行或一行,只返回一列或值。