Begge dine linkede svar indeholder løsninger, men det kan være godt at have et omnibussvar.
Postgres er stærkt skrevet. Dens funktioner og operatører returnerer specifikke typer.
-> returnerer jsonb. Sammenlign det ikke med SQL null, men 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)
->> returnerer tekst og konverterer jsonb null til 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)
Bemærk, at mens jsonb null bare er en anden værdi, er SQL null meget speciel. Nul er ikke en værdi, det er manglen på en værdi. Nul er lig med ingenting, ikke engang null . Det kan virke som om at caste null til jsonb skulle producere jsonb null, men SQL-standarden kræver, at null kun caster til null ellers ville det betyde, at null svarer til noget.
Dette er grunden til, at jsonb null kan konverteres til null, men null castes ikke til jsonb null. null::jsonb
er null . Dette er ubelejligt, men kræves af SQL-standarden. Det er en af grundene til, at det ikke anbefales at caste frem og tilbage mellem jsonb og tekst.