Return 如果计算值在一个范围内则为 NULL

Return NULL if calculated value falls within a range

我正在对日期字段执行一个相当简单的计算,并且我想在日期早于预定义日期的情况下 return NULL 值。本质上,我正在寻找最有效的方法来使用除相等以外的运算符来执行 NULLIF

下面是我想做的一个例子(显然语法不对):

SELECT
    Id,
    NULLIF(DATEADD(DAY, -180, SurveyDate),  
        {LESS THAN} '20190101')
FROM dbo.Vendor

我使用以下查询得到了想要的结果,但它看起来有点笨拙和冗长:

SELECT
    Id,
    CASE WHEN DATEADD(DAY, -180, SurveyDate) < '20190101'
        THEN NULL
    ELSE
        DATEADD(DAY, -180, SurveyDate)
    END
FROM dbo.Vendor

您可以放置​​一个内联 IIF 语句。让它少一点'clunky'

SELECT Id, IIF(DATEADD(DAY, -180, SurveyDate) < '20190101', NULL, DATEADD(DAY, -180, SurveyDate)) AS SurveyDate
FROM dbo.Vendor

首先,是时候升级数据库服务器了。
请注意,2008 和 2008 r2 版本的扩展支持已于 2019 年 7 月 9 日结束——这意味着不再有更新,甚至不会开发安全补丁(当然,即使在扩展支持结束后,微软保留发布安全补丁的权利)。
有关详细信息,请阅读 RedGate 上的 The End of SQL Server 2008 and 2008 R2 Extended Support

话虽如此,对于 2008 r2,您没有太多选择 - case 表达式可能是您唯一可行的选择。
然而,如果你不想写 dateadd 两次,你可以像这样使用 cross apply

SELECT
Id,
CASE WHEN TargetDate < '20190101'
    THEN NULL
ELSE
   TargetDate
END
FROM dbo.Vendor
CROSS APPLY
(
    SELECT DATEADD(DAY, -180, SurveyDate) As TargetDate
) As td

在这种简单的情况下,这似乎有点矫枉过正,但是当您有一个复杂的表达式或多个计算列时,cross apply 就派上用场了。

您可以做的一个简化是删除 CASE 语句的 ELSE 部分:

CASE WHEN DATEADD(DAY, -180, SurveyDate) >= '20190101' THEN DATEADD(DAY, -180, SurveyDate) END

我不明白您如何只调用函数 DATEADD() 1 次而不增加代码的复杂性。