今天,我对这case
种行为感到惊讶:
select case when null then true else false end;
case
------
f
我希望它能返回null
,因为null
铸造成null
而不是false
:
select null::boolean is null;
?column?
----------
t
对这种行为的理由有何 comments ?我错过了什么?
今天,我对这case
种行为感到惊讶:
select case when null then true else false end;
case
------
f
我希望它能返回null
,因为null
铸造成null
而不是false
:
select null::boolean is null;
?column?
----------
t
对这种行为的理由有何 comments ?我错过了什么?
您认为CASE
表达式就像将null
作为函数或运算符的输入,其中空输入通常会导致空输出:
regress=> SELECT 't'::boolean = NULL::boolean;
bool
------
(1 row)
实际上,就空处理而言,它的行为类似于WHERE
子句:
craig=> SELECT 't' WHERE NULL;
?column?
----------
(0 rows)
在WHERE
条中——在CASE
条中,来自测试表达式的NULL
条结果被视为"不正确,因此是错误的".在某些方面,令人遗憾的是,SQL标准没有将WHERE
表达式中的NULL
结果视为错误,而不是将其视为错误,但事实就是这样.
这是NULL
人格分裂的另一个痛苦症状,SQL规范无法确定NULL
是指"未知/未定义的值"还是"缺少值",就像NULL
和聚合的可怕混乱一样.