Por fundição JSONb NULO para um tipo de falha, é uma especificação de erro?

0

Pergunta

Como comentado nesta resposta,

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

resulta em "ERRO: não é possível lançar jsonb nulo tipo integer"... Ok, este é o "PostgreSQL" de qualquer forma", mas por que não torná-lo melhor? Melhor do que adicionar CASE cláusulas, ele está fazendo "natural" da coisa, que está lançando um JSON-valor NULO para um SQL digitado o valor nulo. Então, não é um problema de implementação, mas parece um erro de especificação no PostregSQL: ele é?

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

Melhor resposta

2

A razão é que o SQL NULL é muito diferente do JSON null.

Se você quer fazer isso:

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)

Use NULLIF para transformar JSON null para o SQL NULL.

2021-11-17 05:29:10

Em outros idiomas

Esta página está em outros idiomas

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