Por qué casting JSONb NULL a un tipo de falla, es una especificación de error?

0

Pregunta

Como se ha comentado en esta respuesta,

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

resultados de "ERROR: no se puede elenco jsonb nulo de tipo integer"... Ok, este es el "PostgreSQL manera", pero ¿por qué no hacerlo mejor? Mejor que agregar CASE cláusulas, que está haciendo el "naturales" de la cosa, que está lanzando un JSON-valor NULL a un SQL escrito valor null. Así, no es un problema de aplicación, pero me parece un error de especificación en PostregSQL: que es?

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

Mejor respuesta

2

La razón es que el SQL NULL es muy diferente de JSON null.

Si usted desea hacer esto:

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)

Uso NULLIF para transformar JSON null para SQL NULL.

2021-11-17 05:29:10

En otros idiomas

Esta página está en otros idiomas

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