Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用CASE语句包含一个包含所有内容的类别_Sql_Sql Server_Sql Server 2012_Case - Fatal编程技术网

Sql 使用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表达式,它是:

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-希望第三种选择是您需要的