如本答案所述,
SELECT (j->'i')::int FROM (SELECT '{"i":null}'::jsonb) t(j); -- fail
导致";错误:无法将jsonb null强制转换为integer"类型。。。好的,这是";PostgreSQL方式";,但是为什么不让它变得更好呢与其添加CASE
子句,不如做"天然的";事情,即将JSON-NULL值强制转换为SQL类型的NULL值。所以,这不是一个实现问题,但它似乎是PostregSQL中的规范错误:是吗
原因是SQL NULL与JSONnull
有很大不同。
如果你想这样做:
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将JSONnull
转换为SQLNULL
。