与此C#语句等效的SQL是什么?
bool isInPast = (x != null ? x < DateTime.Now() : true)
我需要构建一个WHERE
子句,仅在x < NOW()
时检查x IS NOT NULL
。 x
是一个datetime
,有时需要为空,其他时候不为null,我只希望WHERE
子句考虑非空值,并将空值视为真
现在该条款是:
dbo.assignments.[end] < { fn NOW() }
适用于非NULL情况,但NULL值似乎总是使表达式计算为false。我试过了:
dbo.assignments.[end] IS NOT NULL AND dbo.assignments.[end] < { fn NOW() }
这似乎没有效果。
答案 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的所有值,因此不再可能基于它进行任何优化(对索引进行范围扫描)。