今天我对这个case
行为感到惊讶:
select case when null then true else false end;
case
------
f
我希望它会返回null
,因为null
已投放到布尔yelds null
而不是false
:
select null::boolean is null;
?column?
----------
t
对此行为的理由有何评论?我错过了什么?
答案 0 :(得分:16)
使用类似
的内容case when p.parent_id is null then false else true end as has_parent
答案 1 :(得分:14)
如果您(也)需要类似
的内容if column is null then 'value'
使用:
COALESCE(column_name, 'replacment for null value') as column_name
如果您仍需要案例陈述,请使用:
case COALESCE(column_name, 'asdf')
when 'asdf' then true
else false
end as desired_column_name
答案 2 :(得分:13)
您正在考虑将CASE
表达式视为将null
作为函数或运算符的输入,其中null输入通常会导致null输出:
regress=> SELECT 't'::boolean = NULL::boolean;
bool
------
(1 row)
事实上,就空处理而言,它的行为类似于WHERE
子句:
craig=> SELECT 't' WHERE NULL;
?column?
----------
(0 rows)
在WHERE
子句中 - 在CASE
中,来自测试表达式的NULL
结果被视为“不为真,因此为假”。在某些方面,令人遗憾的是,SQL标准没有使NULL
表达式导致WHERE
表达式错误而不是将其视为错误,但事实就是如此。
这是NULL
分裂性格的另一个痛苦症状,其中SQL规范无法确定NULL
是否意味着“未知/未定义的值”或“缺少值”,就像NULL
和聚合物的可怕混乱一样。
答案 3 :(得分:5)
您可以使用'select'检查DATA列是否为null:
select
ID,
case (select 1 where DATA is null)
when 1 then 'no data'
else data
end
from ...
答案 4 :(得分:1)
如果没有WHEN 条件 为真,则案例表达式的值为 ELSE子句中的 结果 。如果省略ELSE子句且没有条件匹配,则结果为null。
Postgresql不会转换输出,因为你有else
条件,所以你得到false
。下一个查询返回一个空值(因为没有else
条件)
select case when null then true end;
答案 5 :(得分:1)
您编写的CASE
语句有两个分支:
一个when null then true
永远不会发生(因为null
不等于true
)
else
分支,当常规when
分支中没有匹配时会发生这种情况。
示例:
CASE WHEN val = 1 THEN 5
WHEN val = 2 THEN 10
ELSE 20 /*all other values, including null*/
END