Unkown 相当于 PostgreSQL 中的 Null 吗?

Joe*_*tra 1 sql postgresql logical-operators

我的查询中有一些复杂的比较,我想确保在存在空值的情况下正确理解逻辑。在 PostgreSQL 中,“unknown”似乎与“null”是一样的,我没想到会这样。

这是我的例子:

create table tab (col int);

insert into tab (col) values (7), (11), (null);


select col,
  (col = 7) is true as is_true,
  (col = 7) is false as is_false,
  (col = 7) is unknown as is_unknown,
  (col = 7) is null as is_null
  from tab;
Run Code Online (Sandbox Code Playgroud)

它显示输出:

+-----+--------+---------+-----------+--------+
|a    |is_true |is_false |is_unknown |is_null |
+-----+--------+---------+-----------+--------+
|7    |true    |false    |false      |false   |
|11   |false   |true     |false      |false   |
|null |false   |false    |true       |**true**|
+-----+--------+---------+-----------+--------+
Run Code Online (Sandbox Code Playgroud)

最后一个值不应该是“假”而不是“真”吗?

Lau*_*lbe 5

这是 SQL 标准对 NULL 值的规定:

\n
\n

每个数据类型都包含一个特殊值,称为空值,有时用关键字表示NULL。该值在以下方面与其他值不同:

\n
    \n
  • NULL由于空值存在于每种数据类型中,因此无法推断关键字隐含的空值的数据类型;因此NULL只能在某些上下文中用于表示空值,而不是在允许使用文字的任何地方。
  • \n
  • 尽管空值既不等于任何其他值也不等于任何其他值 \xe2\x80\x94 ,但在某些情况下未知它是否等于任何给定值 \xe2\x80\x94 ,多个空值一起接受治疗;例如,<group by 子句> 将所有空值一起处理。
  • \n
\n
\n

这是标准对布尔值的规定:

\n
\n

数据类型 boolean 包含不同的真值TrueFalse。除非 NOT NULL 约束禁止,否则布尔数据类型还支持真值Unknown作为 null 值。本规范不区分布尔数据类型的空值和作为 SQL <predicate>、<search condition> 或 <boolean value expression> 结果的真值Unknown ;它们可以互换使用以表示完全相同的事物。

\n
\n

所以对于 a 来说booleanIS NULL与 相同IS UNKNOWN。您可能会说,如果声明 \xe2\x80\x9cunknown\xe2\x80\x9d 值,然后说它与 NULL 相同,则有点愚蠢,但这就是 SQL 标准的方式。

\n

然而,当你考虑到有多少人正确理解 NULL 时,它会产生以下陈述,这感觉像是一个深刻的事实:

\n
SELECT NULL IS UNKNOWN;\n\n ?column? \n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n t\n(1 row)\n
Run Code Online (Sandbox Code Playgroud)\n