26

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

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

我希望它会返回null,因为null转换为布尔值的结果是 anull不是 a false

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

对这种行为的基本原理有何评论?我错过了什么?

4

6 回答 6

46

使用类似的东西

case when p.parent_id is null then false else true end as has_parent
于 2014-07-10T22:38:03.297 回答
37

如果您(也)需要类似的东西

if column is null then 'value' 

利用:

COALESCE(column_name, 'replacment for null value') as column_name

如果您仍然需要 case 语句,请使用:

case COALESCE(column_name, 'asdf') 
when 'asdf' then true
else false
end as desired_column_name
于 2015-08-17T14:12:17.643 回答
16

您正在考虑将CASE表达式null作为函数或运算符的输入,其中 null 输入通常会导致 null 输出:

regress=> SELECT 't'::boolean = NULL::boolean;
 bool 
------

(1 row)

而事实上它WHERE在 null 处理方面表现得像一个子句:

craig=> SELECT 't' WHERE NULL;
 ?column? 
----------
(0 rows)

WHERE子句 - 和 in 中CASENULL来自测试表达式的结果被视为“不正确,因此为错误”。在某些方面,令人遗憾的是 SQL 标准没有将表达式NULL中的结果WHERE作为错误而不是将其视为错误,但事实就是如此。

NULL这是人格分裂的另一个痛苦症状, SQL 规范无法确定NULL是“未知/未定义值”还是“没有值”,就像NULLs 和聚合的可怕混乱一样。

于 2013-03-14T23:52:07.643 回答
5

您可以使用“选择”来检查 DATA 列是否为空:

select 
  ID,
  case (select 1 where DATA is null)
    when 1 then 'no data'
    else data
  end
from ...
于 2014-11-25T07:33:56.237 回答
1

正如PostgreSQL 文档所述:

如果没有 WHEN条件为真,则 case 表达式的值是 ELSE 子句中的结果。如果省略 ELSE 子句并且没有条件匹配,则结果为空。

Postgresql 不会强制转换输出,并且由于您else有条件,因此您将获得false. 下一个查询返回一个空值(因为没有else条件)

select case when null then true end;
于 2013-03-14T18:39:05.610 回答
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
于 2013-03-14T18:40:07.133 回答