Sus dos respuestas vinculadas contienen soluciones, pero podría ser bueno tener una respuesta general.
Postgres está fuertemente tipado. Sus funciones y operadores devuelven tipos específicos.
->
devuelve jsonb. Compárelo no con SQL nulo sino con jsonb nulo
.
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)
->>
devuelve texto y convertirá jsonb nulo en SQL nulo
.
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)
Tenga en cuenta que si bien jsonb null es solo otro valor, SQL null es muy especial. Nulo no es un valor, es la falta de un valor. Nulo es igual a nada, ni siquiera nulo . Puede parecer que convertir nulo a jsonb debería producir jsonb nulo, pero el estándar SQL requiere que null solo convierta a nulo de lo contrario, eso significaría que nulo es equivalente a algo.
Esta es la razón por la cual jsonb null se puede convertir en nulo, pero nulo no se convierte en jsonb null. null::jsonb
es nulo . Esto es inconveniente, pero requerido por el estándar SQL. Es una de las razones por las que no se recomienda la conversión de texto entre jsonb y text.