Pourquoi casting JSONb NULL à un type échoue, il est une spécification bug?

0

La question

Comme commenté dans cette réponse,

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

résultats dans "ERREUR: ne peut pas lancer de jsonb nulle de type integer"... Ok, c'est le "PostgreSQL", mais pourquoi ne pas faire mieux? Mieux que d'en ajouter CASE clauses, il est en train de faire "naturel" de la chose, qui est de lancer un JSON-valeur NULL en SQL tapées valeur null. Il n'est donc pas un problème de mise en œuvre, mais il semble qu'une spécification bug dans PostregSQL: il est?

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

La meilleure réponse

2

La raison en est que SQL NULL est tout à fait différent de JSON null.

Si vous voulez faire ceci:

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)

Utilisation NULLIF de transformer JSON null pour SQL NULL.

2021-11-17 05:29:10

Dans d'autres langues

Cette page est dans d'autres langues

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