Sql 使用CASE语句包含一个包含所有内容的类别
如果我有一个CASE表达式,它是:Sql 使用CASE语句包含一个包含所有内容的类别,sql,sql-server,sql-server-2012,case,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 WHEN Category='A' THEN 'Discharged'
WHEN Category='B' THEN 'Not Discharged'
WHEN Category='A' OR Category='B' THEN 'Both'
END AS Status
我注意到,该案例没有显示单独的“两者”状态记录。它只显示“已放电”或“未放电”。是否有办法使案例表达式包含单独的“两者”结果以及每个“已解除”或“未解除”结果
如果我在“已释放”或“未释放”上方为“两者”编码条件,则所有记录的输出均显示“两者”。我相信这与CASE是顺序的逻辑是一致的。
CASE
表达式是按照代码中的“外观”顺序计算的,并且是短路的。在您的情况下,将最后一个移动到第一个位置
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
有关按位运算符和用法的完整列表,请参见:
如果要按该表达式过滤,即它出现在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 )
你可以用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
你能提供一些样本数据吗?你还可以发布整个查询吗?你想用这个实现什么,类别是否只能分为A和B?如果是这样的话,为什么不为每一条记录打印“二者”,除了已释放/未释放?这个状态字段实际上被输入BI工具,用作过滤器。“两者”状态将允许我显示所有结果,而不必在已出院和未出院之间选择一个或两个。是否存在A&B以外的类别值?您的意思是,如果有两个相同id的记录,每个记录的类别“A”和“B”不同(“已释放”和“未释放”,应该有另一行,该行的状态值为“同时”并且不起作用,因为行级别上的类别不能同时为a和B。这两个行的概念都是包含所有内容的。不是说它可以同时释放和不释放。这是一个冗余行,显示状态为“同时”当我对这两种情况都进行筛选时,我基本上得到了所有可能的状态。2在本例中为+1,包括ELSE,但我在这里不是为了让事情变得更简单。@AS91-希望第三种选择是您需要的