null的计算结果为false

时间:2013-03-14 18:18:51

标签: postgresql

今天我对这个case行为感到惊讶:

select case when null then true else false end;
 case 
------
 f

我希望它会返回null,因为null已投放到布尔yelds null而不是false

select null::boolean is null;
 ?column? 
----------
 t

对此行为的理由有何评论?我错过了什么?

6 个答案:

答案 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)

正如PostgreSQL documentation所述:

  

如果没有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