(注意:我不是问如何将列与NULL
进行比较。)
我注意到在PostgreSQL中如果我们SELECT 42 WHERE NULL
,结果集为空。因此,像SELECT c FROM t WHERE c > 0
这样的内容会从t
中选择c
NULL
且大于零的所有行(因为{{1}时} c
条件NULL
评估为c > 0
)。
我不确定我是否可以依赖这种行为,因为NULL
似乎是一种黑客行为。 (可能更恰当的方法是使用WHERE NULL
表达式。)
答案 0 :(得分:2)
这不是Postgres特有的行为。它是如何定义SQL以及如何在SQL中定义NULL
值的。
条件:
WHERE c > 0
是肯定的条件。它将c > 0
计算的所有行保持为真。
当c
为NULL
时,c > 0
评估为NULL
。 NULL
不是真的(也不是假的),因此c > 0
过滤掉了NULL
个值。几乎所有与NULL
的比较都会返回NULL
。
另外:
WHERE NOT (c > 0)
还会过滤掉NULL
值,因为NOT NULL
与NULL
相同。
如果您想保留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不是"等于"空值。 (空值表示未知值,并且不知道两个未知值是否相等。)