简单的where子句条件涉及NULL

时间:2018-02-09 14:40:10

标签: sql where

我有一个需要排除空值和空值的查询,但由于某种原因,我无法解决这个简单的逻辑。

目前,我的代码如下所示:

WHERE [Imported] = 0 AND ([Value] IS NOT NULL **OR** [Value] != '') 

但是,如果我的代码看起来像这样排除这两个条件:

WHERE [Imported] = 0 AND ([Value] IS NOT NULL **AND** [Value] != '') 

出于某种原因,我无法正确地解决这个问题。对我来说,似乎两者都有效。

2 个答案:

答案 0 :(得分:1)

在你的问题中你写了以下内容:

  

有一个查询需要排除Null 空白值

所以你已经回答了自己,AND查询是正确的查询:

WHERE [Imported] = 0 AND ([Value] IS NOT NULL AND [Value] != '') 

以下是我从this问题借用的ANSI SQL Draft 2003的摘录:

  

6.3.3.3规则评估顺序

     

[...]

     

优先级不是由格式决定的   括号,表达式的有效评价一般   从左到右执行。但是,确实如此   依赖于实现表达式是否实际上是从左到右计算的,特别是在操作数或运算符可能时   引起条件或表达式的结果   可以在不完全评估的所有部分的情况下确定   表达

您没有指定您正在使用的数据库系统类型,但前一段中解释的短路评估概念适用于所有主要SQL版本(T-SQL,PL / SQL等...)

短路评估意味着一旦成功评估了表达式,它将立即退出该条件并停止评估适用于您的问题的其他表达式:

如果value为null,则要退出条件,这就是为什么它应该是第一个表达式(从左到右)但是如果它不为null它也应该不为空,所以它必须是非空的而不是空的。

这种情况有点棘手,因为你不能有一个也为空的非空字符串,所以OR条件也可以工作,但你会做一个额外的评估,因为短路评估永远不会在第一个表达式中退出:

Value为null但我们总是需要检查value是否也不是空字符串(value为空或值不是空字符串)。

在第二种情况下,您可能会收到异常,因为可以在空对象上检查表达式[Value] != ''

所以我认为AND是正确的答案。希望它有所帮助。

答案 1 :(得分:1)

如果值是数字且您不想要1或2,则将该条件写为

... WHERE value != 1 AND value != 2

在这种情况下,OR总是正确的。例如,对于2的检查,值1将返回true - 然后OR检查将返回true,因为至少有一个条件被评估为true。

当yu还要检查null值时,情况会有点复杂。对空值的检查始终失败:当值为null时,value != ''为false。这就是为什么有一个特殊的IS NULLIS NOT NULL测试。