2010-07-01 89 views
6

是否有可能在when语句的case子句中写入子查询在case子句中的SQL相关子查询

ie。

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 

谢谢!

回答

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; 

是否可以在该值柱上做一些基于 的事情? N

你能做到这一点,这在第二CASE表达式使用的可乐,而不是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考虑“那并不工作”的默认值。]

不过,我认为你询问是否可以“再利用”一CASE表达的相同结果3210子句,在这种情况下是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的要求。

+0

感谢您的建议和解释。 – Tyug 2010-07-04 18:05:35

2

案例语句评估为单个值,因此您无法从中返回多个列。您可以在Where子句中使用相关的子查询,尽管您没有在您尝试使用该示例的位置显示示例。 colC是否适用于Where子句取决于您的数据库引擎。我曾与一些做过的工作以及其他需要您重新运行Where子句中的子查询的人一起工作。

+0

感谢您的解释!仅供参考,它适用于DB2。 – Tyug 2010-07-04 18:06:30

1

是有可能写出的情况下子句中的子查询的时候声明

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

是否可以根据该值列做些什么?

是的,与上述相同的注意事项。

此外,上述情况允许返回多个不同的列,这取决于colC是哪个值?

否。子查询必须返回零或一行,并且只返回一列或值。