使用CASE语句包括ALL包含类别

时间:2017-08-24 23:04:38

标签: sql sql-server sql-server-2012 case

如果我的CASE表达式为:

CASE WHEN Category='A' THEN 'Discharged'
     WHEN Category='B' THEN 'Not Discharged'
     WHEN Category='A' OR Category='B' THEN 'Both'
   END AS Status

我注意到CASE没有显示单独的' Both'状态记录。它只显示' Discharged'或者'没有出院'。有没有办法让CASE表达式包含一个单独的' Both'结果与每个被释放的'或者'不会被解雇'结果

如果我为' Both'编码条件?以上'出院'或者' Not Discharged',输出显示' Both'对于所有记录。我认为这与CASE顺序的逻辑有关。

2 个答案:

答案 0 :(得分:1)

CASE表达式按照"外观"的顺序进行评估。在代码中并被短路。在您的情况下,将最后WHEN移至第一个位置。

CASE表达式使用布尔比较而不是按位。

CASE
    WHEN Category='A' AND Category='B' THEN 'Both'
    WHEN Category='A' THEN 'Discharged'
    WHEN Category='B' THEN 'Not Discharged'
END AS Status

对于按位比较,请尝试:

DECLARE @Category INT = ASCII('A' )|ASCII('B')
SELECT
    CASE
        WHEN @Category = (ASCII('A' )|ASCII('B')) THEN 'Both'
        WHEN @Category= ASCII('A') THEN 'Discharged'
        WHEN @Category= ASCII('B') THEN 'Not Discharged'
    END AS Status

注意:最好还有一个ELSE条件,以避免在条件不匹配时返回NULL

有关按位运算符和用法的完整列表,请参阅:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-operators-transact-sql

如果您想按该表达式进行过滤,即它出现在WHERE子句中,那么您需要以不同的方式编写它:

DECLARE @SearchCriteria VARCHAR( 50 )
SET @SearchCriteria = 'Both'
SELECT Category
FROM ( VALUES( 'A' ), ( 'B' )) AS a( Category )
WHERE
    Category = ( CASE @SearchCriteria
        WHEN 'Discharged' THEN 'A'
        WHEN 'Not Discharged' THEN 'B'
        WHEN 'Both' THEN Category
    END )

答案 1 :(得分:1)

您可以使用UNION

SELECT person_id,
       ...
       CASE WHEN Category='A' THEN 'Discharged'
            WHEN Category='B' THEN 'Not Discharged'
        END AS Status
  FROM table
 UNION
SELECT person_id,
       ...
       'Both' AS Status
  FROM table