如果计算值在一定范围内,则返回NULL

时间:2019-08-26 19:21:31

标签: sql-server sql-server-2008-r2

我正在对日期字段执行相当简单的计算,并且在日期早于预定义日期的情况下,我想返回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

3 个答案:

答案 0 :(得分:2)

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

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

我看不到如何仅对函数DATEADD()进行一次调用,而又不会给代码带来更多的复杂性。

答案 1 :(得分:0)

您可以插入内联IIF语句。使其不那么“笨拙”

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

答案 2 :(得分:0)

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

话虽如此,但在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就派上用场了。