Kedua jawaban tertaut Anda berisi solusi, tetapi mungkin baik untuk memiliki jawaban omnibus.
Postgres diketik dengan kuat. Fungsi dan operatornya mengembalikan tipe tertentu.
->
mengembalikan jsonb. Bandingkan bukan dengan SQL null tetapi 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)
->>
mengembalikan teks dan akan mengonversi jsonb null menjadi 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)
Perhatikan bahwa sementara jsonb null hanyalah nilai lain, SQL null sangat istimewa. Null bukan nilai, itu adalah kurangnya nilai. Null tidak berarti apa-apa, bahkan nol . Tampaknya casting null ke jsonb akan menghasilkan jsonb null, tetapi standar SQL mengharuskan null hanya menghasilkan null jika tidak, itu berarti null sama dengan sesuatu.
Inilah sebabnya mengapa jsonb null dapat dikonversi ke null, tetapi null tidak dilemparkan ke jsonb null. null::jsonb
adalah nol . Ini tidak nyaman, tetapi diperlukan oleh standar SQL. Ini adalah salah satu alasan mengapa tidak disarankan untuk melakukan bolak-balik antara jsonb dan teks.