SELECT (j->'i')::int FROM (SELECT '{"i":null}'::jsonb) t(j); -- fail
结果“错误:无法将 jsonb null 转换为整数类型”...好吧,这是“PostgreSQL 方式”,但是为什么不让它变得更好呢?比添加 CASE
子句更好,它正在做“自然”的事情,即将 JSON-NULL 值转换为 SQL 类型的 null 值。所以,这不是一个实现问题,但它似乎是 PostregSQL 中的一个规范错误:是吗?
最佳答案
原因是 SQL NULL 与 JSON null
有很大不同。
如果你想这样做:
SELECT nullif((j->'i'), 'null')::int FROM (SELECT '{"i":null}'::jsonb) t(j);
nullif
--------
NULL
(1 row)
SELECT pg_typeof(nullif((j->'i'), 'null')::int) FROM (SELECT '{"i":null}'::jsonb) t(j);
pg_typeof
-----------
integer
SELECT nullif((j->'i'), 'null')::int FROM (SELECT '{"i": 1}'::jsonb) t(j);
nullif
--------
1
(1 row)
使用NULLIF将 JSON null
转换为 SQL NULL
。
关于postgresql - 为什么将 JSONb NULL 转换为类型失败,这是一个规范错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69995304/