2017-09-04 60 views
1

我试图在一个SQL查询中应用两个条件。如何在SQL查询中使用两次CASE子句

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

这给了我输出为 “是”,其中的情况下,只有1个文件中像下面是正确的:

当前结果:

99 , Yes 
99 , Yes 
99 , Yes 

预期结果:

99 , No 
99 , No 
99 , Yes 

我正在使用下面的查询,但SQL查询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 Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

如何解决这一问题?

+0

使用'CASE WHEN'“internal”'CASE WHEN 1 = 1 THEN 0 ELSE CASE when 2 = 2 THEN 2 ELSE 0 END END' – Fabio

+5

为什么两个case case语句似乎做同样的事情? – spyr0

+1

请提供样本数据和期望的结果。 –

回答

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 

你打算给第一列一个名字吗?

+0

非常感谢回复。我编辑了我的问题,并试图说清楚。正如你指出的那样,我已经完成了这个查询。但是抛出错误可能是我的错误。请提醒我我做错了什么。谢谢。 – DBOn

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

非常感谢@Arix。请参阅我编辑了我的问题和我明确的要求。 – DBOn

+0

你可以给你上下文关于你如何使用它?你有两列被返回,其中一个是一个数字... 99,另一个是'是'或'不'。你是否试图随机化是和否? – Arix

0

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

0

所以,你的第一个查询,你说:

CASE WHEN userID = 99 OR userID != 99 

换句话说:

CASE WHEN 1=1 

这就是为什么它的一切(不知道;是你的电流之间的差异预期的结果应该考虑到所有行的用户ID都是99)。

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

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

假设你持有的缺失部分的查询,如而来。