De ce turnare JSONb NULL pentru un tip eșuează, este o specificație bug?

0

Problema

Cum a comentat în acest răspuns,

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

rezultatele în "EROARE: nu se poate arunca jsonb nul de tip integer"... Ok, asta e "PostgreSQL drum", dar de ce nu face mai bine? Mai bine decât se adauga CASE clauze, care este de a face lucru "natural", care aruncă o JSON-valoarea NULL pentru un SQL introduce valoarea null. Deci, nu este o punere în aplicare problema, dar se pare că o specificație bug în PostregSQL: este?

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

Cel mai bun răspuns

2

Motivul este că SQL NULL este destul de diferit de JSON null.

Dacă doriți pentru a face acest lucru:

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)

Utilizarea NULLIF de a transforma JSON null la SQL NULL.

2021-11-17 05:29:10

În alte limbi

Această pagină este în alte limbi

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