EXISTS中的CASE语句

时间:2012-07-20 13:58:21

标签: sql sql-server-2008 case exists

我需要创建一个如下所示的查询:

  

SELECT attr
  来自SomeTable B
  在哪里存在
  (例如,当B.some_attr = 0时      然后(选择x来自C,其中B.z = z)
  当B.some_attr = 1时   那么(选择x从D到哪里B.z = x)
  END)

但SQL Server拒绝执行此操作会带来一些语法错误。
如何修改此查询以使其有效?

编辑:我正在添加错误:

  

Msg 156,Level 15,State 1,Line 4关键字'CASE'附近的语法不正确。
  消息156,级别15,状态1,行6关键字'WHEN'附近的语法不正确。
  消息102,级别15,状态1,行8''''附近的语法不正确。

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT A 
FROM B 
WHERE 
     CASE 
     WHEN B.some_attr = 0 AND EXISTS(SELECT x FROM C WHERE B.z = z) THEN 1
     WHEN B.some_attr = 1 AND EXISTS(SELECT x FROM D WHERE B.z = x) THEN 1
     END = 1

答案 1 :(得分:1)

试试这个:

SELECT A
FROM B
WHERE 
    (CASE WHEN B.some_attr = 0
          THEN (SELECT x FROM C WHERE B.z = z)
          WHEN B.some_attr = 1
          THEN (SELECT x FROM D WHERE B.z = x)
     END) is not null

这假定子查询返回一行。如果没有,只需输入max(x)而不是x。

答案 2 :(得分:1)

我认为这也应该有效:

SELECT attr 
FROM SomeTable B 
WHERE EXISTS (
    SELECT 1 FROM C WHERE B.some_attr = 0 AND B.z = z UNION ALL
    SELECT 1 FROM D WHERE B.some_attr = 1 AND B.z = x
)