PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Meilleure pratique pour identifier un null jsonb dans plpgsql

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.