Proč casting JSONb NULL typu selže, to je specifikace bug?

0

Otázka

Jak poznamenal v této odpovědi,

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

výsledky v "ERROR: cannot obsazení jsonb null pro typ integer"... Ok, to je "PostgreSQL cestě", ale proč ne, aby to bylo lepší? Lepší, než se přidat CASE doložky, to je na tom "přirozenou" věc, že je casting JSON-hodnoty NULL pro SQL zadali hodnotu null. Takže, to je implementační problém, ale zdá specifikace chybu v PostregSQL: to je?

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

Nejlepší odpověď

2

Důvodem je, že SQL NULL je docela odlišný od JSON null.

Pokud si chcete udělat toto:

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)

Použití NULLIF k transformaci JSON null SQL NULL.

2021-11-17 05:29:10

V jiných jazycích

Tato stránka je v jiných jazycích

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