【问题标题】:Implement CASE in WHERE clause在 WHERE 子句中实现 CASE
【发布时间】:2017-01-30 08:40:01
【问题描述】:

在 T-SQL WHERE 子句中,

如果有CI.end_date,我希望admit_date 介于CI.start_dateCI.end_date 之间。如果没有结束日期,那么我希望 admit_date 成为 >= CI.start_date

   WHERE 1=1
       AND CASE WHEN CI.end_date IS NULL 
                 THEN CEV.admit_date >= CI.start_date
                 ELSE CEV.admit_date BETWEEN CI.start_date AND CI.end_date 
                END

这将不起作用,因为我无法将此 CASE 作为 WHERE 子句中表达式的一部分,而不是表达式本身。

我该如何实现?

【问题讨论】:

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


    【解决方案1】:

    CASE 不属于WHERE 子句。它的存在是为了让您有机会评估布尔表达式。在WHERE 子句中你不需要它,因为子句本身就是一个布尔表达式。

    WHERE (CI.end_date IS NULL AND CEV.admit_date >= CI.start_date)
       OR (CI.end_date IS NOT NULL AND CEV.admit_date BETWEEN CI.start_date AND CI.end_date);
    

    或者:

    WHERE CEV.admit_date >= CI.start_date)
      AND (CEV.admit_date <= CI.end_date OR CI.end_date IS NULL);
    

    这可以替换为

    WHERE CEV.admit_date BETWEEN CI.start_date AND COALESCE(CI.end_date, CEV.admit_date);
    

    顺便说一句。

    【讨论】:

    • 我感觉 COALESCE 在这种情况下做得很好,但需要一个指针。欣赏它。
    【解决方案2】:
    WHERE (CI.end_date IS NULL AND CEV.admit_date >= CI.start_date)
       OR (CEV.admit_date BETWEEN CI.start_date AND CI.end_date)
    

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多