如果我的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顺序的逻辑有关。
答案 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