Obie odpowiedzi, do których prowadzisz, zawierają rozwiązania, ale dobrze byłoby mieć odpowiedź zbiorczą.
Postgres jest mocno napisany. Jego funkcje i operatory zwracają określone typy.
-> zwraca jsonb. Porównaj to nie z wartością null SQL, ale wartością 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)
->> zwraca tekst i przekonwertuje null jsonb na null SQL
.
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)
Zauważ, że podczas gdy jsonb null to tylko kolejna wartość, null SQL jest bardzo wyjątkowy. Null nie jest wartością, jest brakiem wartości. Null nic nie znaczy, nawet zero . Może się wydawać, że rzutowanie null na jsonb powinno generować wartość jsonb null, ale standard SQL wymaga, aby null rzutował tylko na null w przeciwnym razie oznaczałoby to, że null jest równoważne czemuś.
Dlatego jsonb null można przekonwertować na null, ale null nie jest rzutowany na jsonb null. null::jsonb
jest zerowe . Jest to niewygodne, ale wymagane przez standard SQL. Jest to jeden z powodów, dla których przerzucanie tam iz powrotem między jsonb a tekstem nie jest zalecane.