Vos deux réponses liées contiennent des solutions, mais il serait peut-être bon d'avoir une réponse omnibus.
Postgres est fortement typé. Ses fonctions et opérateurs renvoient des types spécifiques.
->
renvoie jsonb. Comparez-le non pas à SQL null mais à jsonb null
.
test=# select '{"i_am_null": null, "a_string": "null"}'::jsonb->'i_am_null' = 'null'::jsonb;
?column?
----------
t
(1 row)
test=# select '{"i_am_null": null, "a_string": "null"}'::jsonb->'a_string' = 'null'::jsonb;
?column?
----------
f
(1 row)
->>
renvoie le texte et convertira jsonb null en SQL null
.
test=# select '{"i_am_null": null, "a_string": "null"}'::jsonb->>'i_am_null' is null;
?column?
----------
t
(1 row)
test=# select '{"i_am_null": null, "a_string": "null"}'::jsonb->>'a_string' is null;
?column?
----------
f
(1 row)
Notez que si jsonb null n'est qu'une autre valeur, SQL null est très spécial. Null n'est pas une valeur, c'est l'absence de valeur. Nul équivaut à rien, pas même nul . Il peut sembler que la conversion de null en jsonb devrait produire jsonb null, mais la norme SQL exige que null transtype uniquement en null sinon cela signifierait que null équivaut à quelque chose.
C'est pourquoi jsonb null peut être converti en null, mais null n'est pas converti en jsonb null. null::jsonb
est nul . Ce n'est pas pratique, mais requis par la norme SQL. C'est l'une des raisons pour lesquelles il n'est pas recommandé d'effectuer des allers-retours entre jsonb et text.