为什么当条件不等于真时,PostgreSQL不返回空值

26 浏览
0 Comments

为什么当条件不等于真时,PostgreSQL不返回空值

以下内容的推理让我感到困惑:\n

SELECT * FROM table WHERE avalue is null

\n返回 \'avalue\' 为空的 x 行记录\n

SELECT * FROM table WHERE avalue <> true

\n返回 \'avalue\' 为空的行。 \n我的推理(似乎是错误的)是,由于 null 是一个独特的值(甚至不等于 null),这意味着它应该显示在结果集中,因为它也不等于 true。 \n我猜你可以说,通过说 column <> value,你暗示该列具有一个值,因此完全忽略了 null 值。\n这背后的推理是什么,其他常见的 SQL 数据库是否也是如此? \n我的推理(假设)告诉我这是违反直觉的,我想了解其中的原因。

0
0 Comments

为什么PostgreSQL在条件不满足时不返回空值?

在SQL Server中,这种情况是正常的。你可以使用以下代码来实现:

SELECT * FROM table WHERE ISNULL(avalue, 0) <> 1

对于PostgreSQL的等效方法,请参考:What is the PostgreSQL equivalent for ISNULL()

如果有意义的话,可以考虑使用带有默认值的NOT NULL列规范。

编辑:

我认为这是合理的。NULL不是一个值,所以它被排除在搜索之外 - 你必须明确指定它。如果SQL设计师决定采用第二种方式(自动包括NULL),那么如果你需要识别没有值的情况,你将会遇到更多麻烦。

0
0 Comments

PostgreSQL在条件为<> true时为什么不返回null值?

在SQL中,null表示缺少值或未知值。然而,当条件为<> true时,PostgreSQL不会返回null值。这一现象是由于三值逻辑(Three-valued logic)的使用,这也是一个有争议的话题。

根据这篇文章的内容,null并不是一个值,而是一个值的占位符。因此,在设计时需要做出决策,于是就出现了null不等于任何值的情况。

关于三值逻辑的更多信息可以在这里这里找到。

需要注意的是,simple-talk的文章中有一个错误,即"false AND unknown is unknown"应为"false AND unknown is false",同样的情况也适用于"unknown and false",应该为"false"。这个错误在文章的评论中有所讨论,但文章本身尚未更新。

因此,当条件为<> true时,PostgreSQL不会返回null值,这是由于三值逻辑的设计决策所导致的。

0
0 Comments

为什么PostgreSQL在条件为<> true时不返回null值?

每个合适的RDBMS都是以相同的方式处理这个问题的,因为这是正确的。根据PostgreSQL的官方文档,当任一输入为null时,普通的比较操作符会返回null(表示"unknown"),而不是true或false。如果这种行为不适用,可以使用IS [ NOT ] DISTINCT FROM语法。这些表达式的执行速度略慢于简单的expression <> expression比较。对于boolean值,也可以使用更简单的IS NOT [TRUE | FALSE]语法。

要获取你在第二个查询中期望的结果,可以这样写:

SELECT * FROM tbl WHERE avalue IS NOT TRUE;

问题是你不能定义一个将NULL(或"unknown")与其他任何值进行组合或比较的操作符。对于7 > NULL或7 < NULL或7 + NULL,应该得到什么结果?这些操作是没有意义的。同样,7 <> NULL也没有意义,因此结果是未知的(表示为NULL)。

我同意7 > NULL没有意义。但是7 <> NULL是true,没有其他办法:它们是不同的。同样,7 = NULL应该是false。

除了这不是真的。7 <> NULL和7 = NULL既不是false也不是true,而是NULL。

"因为"是一个非常糟糕的答案。

如果NULL表示"unknown",那么7 > NULL应该是NULL,同样7 < NULL、7 <> NULL和7 = NULL也应该是NULL。如果NULL表示"empty",那么7 = NULL、7 > NULL、7 < NULL应该是false,7 <> NULL应该是true。

0