如何在SQL Query中使用CASE子句两次

时间:2017-09-04 15:48:27

标签: sql sql-server tsql

我正在尝试在一个SQL查询中应用两个条件。

(select DISTINCT (
        CASE WHEN (
         ABC.GemUserID = '99' ) 
         OR ABC.GemUserID != '99'
            THEN 'Yes'
    ELSE 'No'
        END)) AS AllWell

这使我的输出为“是”,因为CASE仅适用于下面的1个文件:

当前结果:

99 , Yes
99 , Yes
99 , Yes

预期结果:

99 , No
99 , No
99 , Yes

我正在使用以下查询,但SQL Query Intellisence将其识别为错误。

错误的查询:

(select DISTINCT (
    CASE WHEN ( ABC.GEMUserID  = '99' THEN 'Yes' else 'No'
    CASE WHEN ( ABC.GEMUserID != '99' THEN 'No'  else 'Yes'

    END)) AS AllWell

修复上述错误查询后:

(select DISTINCT 
        (CASE WHEN  ABC.GemUserID  = '99' THEN 'Yes' else 'No' END), 
        (CASE WHEN  ABC.GemUserID != '99' THEN 'No'  else 'Yes' END))
         AS AllWell

但我收到错误:

  

Msg 116,Level 16,State 1,Line 17只有一个表达式   在未引入子查询时在选择列表中指定   存在。

如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

select distinct - 本身 - 是SQL语法的一部分。 distinct不是函数。不应该用括号括起来。所以,如果我理解你的问题:

select DISTINCT 
       ( CASE WHEN ABC.GEMUserID = '99' THEN 'Yes' else 'No' END),
       ( CASE WHEN ABC.GEMUserID <> '99' THEN 'No'  else 'Yes' END) as AllWell

您打算给第一列命名吗?

答案 1 :(得分:2)

select DISTINCT 
CASE WHEN  ABC.GEMUserID  = '99' THEN 'Yes' 
     ELSE 'No' -- This is automatically When ABC.GEMUserID <> '99'
END AS AllWell

答案 2 :(得分:0)

根据错误,您的查询是一个更大的SQL命令中的子查询(可能在IN后面?)。因此,这样的子查询to return more than one column是不可能的。

答案 3 :(得分:0)

所以你的第一个问题,你已经说过:

CASE WHEN userID = 99 OR userID != 99

换句话说:

CASE WHEN 1=1

这就是为什么它为所有内容返回yes(不确定当前和预期结果之间的差异应该考虑到所有行的userID都是99)。

对于您的错误查询,似乎您在另一个选择的中间返回该选择(因为您在结尾处将其别名)。因此,您不能在嵌套选择中返回多个列。您不需要第二个CASE语句,只需将查询更改为:

(select DISTINCT
    CASE WHEN ABC.GemUserID = '99' THEN 'Yes' Else 'No' End) AS AllWell

假设您将缺少的部分保留在查询中,例如FROM。