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)
最后一个值不应该是“假”而不是“真”吗?
这是 SQL 标准对 NULL 值的规定:
\n\n\n每个数据类型都包含一个特殊值,称为空值,有时用关键字表示
\nNULL。该值在以下方面与其他值不同:\n
\n- \n
NULL由于空值存在于每种数据类型中,因此无法推断关键字隐含的空值的数据类型;因此NULL只能在某些上下文中用于表示空值,而不是在允许使用文字的任何地方。- 尽管空值既不等于任何其他值也不等于任何其他值 \xe2\x80\x94 ,但在某些情况下未知它是否等于任何给定值 \xe2\x80\x94 ,多个空值一起接受治疗;例如,<group by 子句> 将所有空值一起处理。
\n
这是标准对布尔值的规定:
\n\n\n数据类型 boolean 包含不同的真值True和False。除非 NOT NULL 约束禁止,否则布尔数据类型还支持真值Unknown作为 null 值。本规范不区分布尔数据类型的空值和作为 SQL <predicate>、<search condition> 或 <boolean value expression> 结果的真值Unknown ;它们可以互换使用以表示完全相同的事物。
\n
所以对于 a 来说boolean,IS NULL与 相同IS UNKNOWN。您可能会说,如果声明 \xe2\x80\x9cunknown\xe2\x80\x9d 值,然后说它与 NULL 相同,则有点愚蠢,但这就是 SQL 标准的方式。
然而,当你考虑到有多少人正确理解 NULL 时,它会产生以下陈述,这感觉像是一个深刻的事实:
\nSELECT 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)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
836 次 |
| 最近记录: |