今天,我对这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和聚合的可怕混乱一样.

Postgresql相关问答推荐

此PostgreSQL汇总分组不适用于窗口表达式

在Docker容器内的Postgres,如何通过Promail将JSON登录到Loki?

Select 所有数组类型和维度

如何在PostgreSQL 16中设置&Q;VARSIZE&Q;和&Q;SET_VARSIZE&Q;

在特定值的组聚合中添加标签列作为结果

PL/pgSQL中的IP递增函数

Postgres:一次插入多行时自定义upsert(存储过程?)?

正在加载 pgAdmin 4 v7.4...同时打开 pgAdmin

在特定距离内创建点的唯一索引

这个 Supbase 查询在 SQL ( Postgresql ) 中的类似功能是什么

Spring:如何在 PostgreSQL 中使用 KeyHolder

如何在 postgresql 中创建一个空的 JSON 对象?

Psycopg2 在大型 Select 查询中耗尽内存

在 PostgreSQL 中返回插入的行

为 Django Postgres 连接强制 SSL

如何将参数值添加到 pgadmin sql 查询?

psql 致命角色不存在

如何为 Postgres psql 设置时区?

在 Postgres 中显示关系、序列和函数的默认访问权限

postgres LISTEN/NOTIFY rails