И двата ви свързани отговора съдържат решения, но може да е добре да имате омнибусен отговор.
Postgres е строго типизиран. Неговите функции и оператори връщат конкретни типове.
->код> връща jsonb. Сравнете не с SQL null, а с 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)
->>
връща текст и ще преобразува jsonb null в 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)
Имайте предвид, че докато jsonb null е просто друга стойност, SQL null е много специална. Null не е стойност, това е липсата на стойност. Null не е равно на нищо, дори не на null . Може да изглежда, че прехвърлянето на null към jsonb трябва да произведе jsonb null, но стандартът SQL изисква null да прехвърля само към null в противен случай това би означавало, че null е еквивалентно на нещо.
Ето защо jsonb null може да се преобразува в null, но null не се преобразува в jsonb null. null::jsonb
е нулева . Това е неудобно, но се изисква от SQL стандарта. Това е една от причините да не се препоръчва прехвърлянето напред и назад между jsonb и текст.