当条件为<> true时,为什么PostgreSQL不返回空值

Mr *_*ubs 20 sql postgresql comparison null

我对以下原因的理由感到困惑:

SELECT * FROM table WHERE avalue is null
Run Code Online (Sandbox Code Playgroud)

返回'avalue'为空的x行数

SELECT * FROM table WHERE avalue <> true
Run Code Online (Sandbox Code Playgroud)

难道不是其中"安勤为空返回行.

我的推理(似乎是不正确的)是因为它null是一个唯一值(它甚至不等于null)意味着它应该在结果集中显示,因为它不等于true任何一个.

我想你可以争辩说,column <> value你说你暗示该列有一个值因此null完全忽略了这些值.

这背后的原因是什么,这在其他常见的SQL DB中是一样的吗?

我的推理(假设)告诉我这是违反直觉的,我想知道为什么.

Erw*_*ter 34

每一个体面的RDBMS都以相同的方式完成它,因为它是正确的.
我在这里引用Postgres手册:

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

expression IS DISTINCT FROM expression
expression IS NOT DISTINCT FROM expression
Run Code Online (Sandbox Code Playgroud)

请注意,这些表达式的执行速度比简单expression <> expression比较慢.

对于boolean价值观,也更简单IS NOT [TRUE | FALSE].
要获得您在第二个查询中的预期,请写:

SELECT * FROM table WHERE avalue IS NOT TRUE;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.

  • 恕我直言,这是有缺陷的逻辑,而不是“正确的”。如果将7与NULL进行比较,答案应该是未知的,答案应该为假。这是SQL弯曲逻辑。无论如何,感谢出色的回答,`IS DISTINCT FROM`节省了一天的时间。 (2认同)

Mr *_*ubs 6

此链接提供了有用的见解.正如@Damien_The_Unbeliever指出的那样,它使用三值逻辑,并且似乎(根据文章)讨论的主题.

这里这里可以找到其他几个好的链接.

我认为它归结为null不是一个值,而是一个值的占位符,必须做出决定,这就是它......所以NULL不等于任何值,因为它不是一个值而且赢了甚至不等于任何价值......如果这是有道理的.