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 次而不增加代码的复杂性。
我正在对日期字段执行一个相当简单的计算,并且我想在日期早于预定义日期的情况下 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 次而不增加代码的复杂性。