Båda dina länkade svar innehåller lösningar, men det kan vara bra att ha ett omnibussvar.
Postgres är starkt skrivet. Dess funktioner och operatörer returnerar specifika typer.
-> returnerar jsonb. Jämför det inte med SQL null utan 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)
->> returnerar text och kommer att konvertera jsonb null till 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)
Observera att även om jsonb null bara är ett annat värde, så är SQL null väldigt speciellt. Null är inte ett värde, det är avsaknaden av ett värde. Null är lika med ingenting, inte ens null . Det kan tyckas som att casta null till jsonb borde producera jsonb null, men SQL-standarden kräver att null endast castar till null annars skulle det betyda att null motsvarar något.
Det är därför jsonb null kan konverteras till null, men null castas inte till jsonb null. null::jsonb
är null . Detta är obekvämt, men krävs av SQL-standarden. Det är en av anledningarna till att casta fram och tillbaka mellan jsonb och text inte rekommenderas.