我有一个需要排除空值和空值的查询,但由于某种原因,我无法解决这个简单的逻辑。
目前,我的代码如下所示:
WHERE [Imported] = 0 AND ([Value] IS NOT NULL **OR** [Value] != '')
但是,如果我的代码看起来像这样排除这两个条件:
WHERE [Imported] = 0 AND ([Value] IS NOT NULL **AND** [Value] != '')
出于某种原因,我无法正确地解决这个问题。对我来说,似乎两者都有效。
答案 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 NULL
或IS NOT NULL
测试。