【问题标题】:MSSQL Select with CASE in WHERE conditionMSSQL Select with CASE in WHERE 条件
【发布时间】:2019-05-12 09:24:35
【问题描述】:

我有一个案例,我必须选择:

  1. 所有记录
  2. 取消的记录
  3. 打开 = 所有未取消的记录

我正在尝试类似:

SELECT * FROM Status WHERE Description =
    CASE
        WHEN @Status  = 'Cancelled' THEN 'Cancelled'
        WHEN @Status  = 'Open' THEN **NOT Cancelled**
        ELSE Description
    END

“未取消”条件如何写?

谢谢。

【问题讨论】:

  • THEN 'NOT Cancelled'
  • 您以一种似乎不兼容的方式将 CASE 的逻辑与 WHERE 逻辑混合在一起。您最好将其纯粹作为 WHERE 逻辑弄清楚,如下所示
  • 快速提问:如果 WHEN 包括 open 和 not open,什么是 ELSE?

标签: sql sql-server tsql case where


【解决方案1】:

为什么不这样:

WHERE
(@Status = 'Cancelled' AND Description = 'Cancelled')
OR
(@Status = 'Open' AND Description <> 'Cancelled')
OR
@Status NOT IN ('Open', 'Cancelled')
OR
@Status IS NULL

请注意,如果Description 可以是NULL,您需要添加额外的逻辑来处理这些记录,因为NULL = 'string'NULL &lt;&gt; 'sting' 为假。

正如 Zohar Peled 所指出的,它可以进一步简化如下:

WHERE
(@Status = 'Cancelled' AND Description = 'Cancelled')
OR
(@Status = 'Open' AND Description <> 'Cancelled')
OR
ISNULL(@Status, 'Open') NOT IN ('Open', 'Cancelled')

【讨论】:

  • 按预期工作。谢谢!
  • 稍微简化一下:OR ISNULL(@Status, 'Open') NOT IN ('Open', 'Cancelled') 并删除最后一个条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2012-01-13
  • 1970-01-01
  • 2022-10-06
  • 2018-04-07
  • 1970-01-01
  • 2020-04-18
相关资源
最近更新 更多