为什么铸造JSONb NULL类型的失败,它是一个规范的错误?

0

的问题

在评论这个答案,

SELECT (j->'i')::int FROM  (SELECT '{"i":null}'::jsonb) t(j); -- fail

结果,在 "错误:不能投jsonb null到整型"...好的,这是"PostgreSQL的方式",但 为什么不让它更好吗? 比增加 CASE 条款,它是这样做的"自然"的事情,那是铸造一个星空值SQL 类型的空值. 因此,它不是一个执行问题,但这似乎是一个 规范的错误 在PostregSQL: 它是什么?

casting jsonb postgresql
2021-11-16 19:53:05
1

最好的答案

2

其原因是,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)

使用 null,则 以变换JSON null 到SQL NULL.

2021-11-17 05:29:10

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................