在WHERE子句中使用NULL

时间:2017-05-27 12:59:17

标签: sql postgresql

(注意:我不是问如何将列与NULL进行比较。)

我注意到在PostgreSQL中如果我们SELECT 42 WHERE NULL,结果集为空。因此,像SELECT c FROM t WHERE c > 0这样的内容会从t中选择c NULL且大于零的所有行(因为{{1}时} c条件NULL评估为c > 0)。

我不确定我是否可以依赖这种行为,因为NULL似乎是一种黑客行为。 (可能更恰当的方法是使用WHERE NULL表达式。)

2 个答案:

答案 0 :(得分:2)

这不是Postgres特有的行为。它是如何定义SQL以及如何在SQL中定义NULL值的。

条件:

WHERE c > 0

肯定的条件。它将c > 0计算的所有行保持为真。

cNULL时,c > 0评估为NULLNULL不是真的(也不是假的),因此c > 0过滤掉了NULL个值。几乎所有与NULL的比较都会返回NULL

另外:

WHERE NOT (c > 0)

还会过滤掉NULL值,因为NOT NULLNULL相同。

如果您想保留NULL值,我建议明确:

WHERE c > 0 OR c IS NULL

答案 1 :(得分:1)

根据我对the documentation的解释,您可以依赖只返回非空元素的事实:

  

当任一输入为空时,普通比较运算符产生null(表示"未知"),而不是true或false。例如,7 = NULL产生null,7<>空值。如果此行为不合适,请使用IS [NOT] DISTINCT FROM谓词:

a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b
  

对于非空输入,IS DISTINCT FROM与<>相同运营商。但是,如果两个输入都为null,则返回false,如果只有一个输入为null,则返回true。类似地,对于非空输入,IS NOT DISTINCT FROM与=相同,但是当两个输入都为空时返回true,而当只有一个输入为null时返回false。因此,这些谓词有效地表现为null是正常的数据值,而不是" unknown"。

     

要检查值是否为null,请使用谓词:

expression IS NULL
expression IS NOT NULL
  

或等效但非标准的谓词:

expression ISNULL
expression NOTNULL
  

不要写表达式= NULL,因为NULL不是"等于"空值。 (空值表示未知值,并且不知道两个未知值是否相等。)