SQL检查WHERE子句中的NULL(三元运算符?)

时间:2011-02-10 05:42:52

标签: sql sql-server-2005

与此C#语句等效的SQL是什么?

bool isInPast = (x != null ? x < DateTime.Now() : true)

我需要构建一个WHERE子句,仅在x < NOW()时检查x IS NOT NULLx是一个datetime,有时需要为空,其他时候不为null,我只希望WHERE子句考虑非空值,并将空值视为真

现在该条款是:

dbo.assignments.[end] < { fn NOW() }

适用于非NULL情况,但NULL值似乎总是使表达式计算为false。我试过了:

dbo.assignments.[end] IS NOT NULL AND dbo.assignments.[end] < { fn NOW() }

这似乎没有效果。

4 个答案:

答案 0 :(得分:5)

要在WHERE子句中使用,您必须单独测试

where dbo.assignments.[end] is null or dbo.assignments.[end] < GetDate()

或者您可以将空值转换为日期(始终为真)

where isnull(dbo.assignments.[end],0) < GetDate()

或者你可以针对从下面

派生的位标志进行负面测试
where case when dbo.assignments.[end] < GetDate() then 0 else 1 end = 1

<小时/> 以下是解释以及如何为SELECT子句派生isInPast。

  

bool isInPast =(x!= null?x&lt; DateTime.Now():true)

布尔只能有两种结果中的一种,无论是真还是假 仔细查看您的标准,仅适用于错误的条件是

  

x!= null&amp;&amp; x&lt;现在

鉴于这一事实,它变成了一种简单的翻译,因为在SQL中,x < now只能在x!=null时进行评估,因此只需要一个条件

isInPast = case when dbo.assignments.[end] < { fn NOW() } then 0 else 1 end

(1为真,0为假)

不确定{ fn NOW() }代表什么,但如果希望SQL Server提供当前时间,请使用GETDATE()或使用UTC数据,请使用GETUTCDATE()

isInPast = case when dbo.assignments.[end] < GetDate() then 0 else 1 end

答案 1 :(得分:0)

您正在寻找的那个可能是CASE声明

答案 2 :(得分:0)

你需要像

这样的东西
WHERE X IS NULL
OR X < NOW()

答案 3 :(得分:0)

有两个单独的查询,一个在x为空时,一个在没有时。试图混合两个不同的条件是确保获得糟糕计划的保证方式。请记住,生成的计划必须适用于 x的所有值,因此不再可能基于它进行任何优化(对索引进行范围扫描)。