代码之家  ›  专栏  ›  技术社区  ›  AlanPear

涉及NULL的简单where子句条件

  •  0
  • AlanPear  · 技术社区  · 7 年前

    我有一个查询,需要排除Null和空白值,但由于某种原因,我无法在脑海中计算出这个简单的逻辑。

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

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

    但是,我的代码应该如下所示以排除这两种情况:

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

    出于某种原因,我只是无法在脑海中正确地分类。在我看来,这两种方法都可行。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Isma    7 年前

    您在问题中写道:

    有一个需要同时排除两个Null的查询 空白值

    因此,您已经回答了自己,AND查询是正确的查询:

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

    下面是我从ANSI SQL草案2003中借用的摘录 this 问题:

    6.3.3.3规则评估顺序

    [...]

    如果优先级不是由格式或 括号中,表达式的有效计算通常是 从左到右执行。然而,它是 依赖于实现 表达式是否实际从左到右求值,尤其是当操作数或运算符可能 导致条件升高 或者如果表达式的结果 可以在不完全评估 表示

    您没有指定使用哪种数据库系统,但上一段中解释的短路评估概念适用于所有主要的SQL版本(t-SQL、PL/SQL等)

    短路求值意味着一旦成功求值一个表达式,它将立即退出条件并停止求值应用于您的问题的其他表达式:

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

    这种情况有点棘手,因为您不能有一个也为null的非空字符串,所以OR条件也会起作用,但您需要进行额外的计算,因为短路计算永远不会在第一个表达式中退出:

    Value 为null,但我们始终需要检查 价值 也不是空字符串( 价值 为null或值不是空字符串)。

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

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

        2
  •  1
  •   Hans Kesting    7 年前

    如果该值是数字,并且您不需要1或2,那么可以将该条件写为

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

    在这种情况下,OR总是正确的。例如,值1将针对2的检查返回true,然后OR检查将返回true,因为至少有一个条件的计算结果为true。

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