如果计算值在某个范围内,则返回 NULL



我正在对日期字段执行一个相当简单的计算,如果日期在预定义日期之前,我想返回 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

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

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

我看不出如何在不给代码带来更多复杂性的情况下只调用函数DATEADD()1 次。

您可以放置一个内联 IIF 语句。 让它不那么"笨重">

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

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

话虽如此,对于 2008 r2,您没有太多选择 - 大小写表达式可能是您唯一可行的选择。
但是,如果您不想两次编写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就会派上用场。

最新更新