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

cmv*_*cmv 2 sql sql-server-2005

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

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

我需要构造一个只WHERE检查那个的子句.是一个需要有时无效,而不是空其他时间,我只希望条款考虑非空值,并考虑空值是真实的.x < NOW()x IS NOT NULLxdatetimeWHERE

现在这个条款是:

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

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

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

而这似乎没有任何效果.

Ric*_*iwi 5

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

where dbo.assignments.[end] is null or dbo.assignments.[end] < GetDate()
Run Code Online (Sandbox Code Playgroud)

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

where isnull(dbo.assignments.[end],0) < GetDate()
Run Code Online (Sandbox Code Playgroud)

或者你可以对从下面派生的位标志进行负面测试

where case when dbo.assignments.[end] < GetDate() then 0 else 1 end = 1
Run Code Online (Sandbox Code Playgroud)


以下是解释以及如何为SELECT子句派生isInPast.

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

bool只能有两个结果中的一个,无论是真还是假.
仔细观察您的标准,错误唯一条件是何时

x!= null && x <now

鉴于这一事实,它变得很简单,因为在SQL中,x < now只能在何时进行评估x!=null,因此需要一个条件

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

(1为真,0为假)

不知道什么{ fn NOW() }表示,但如果想SQL服务器提供当前时间,使用GETDATE()或者如果您正在使用UTC数据时,使用GETUTCDATE()

isInPast = case when dbo.assignments.[end] < GetDate() then 0 else 1 end
Run Code Online (Sandbox Code Playgroud)