リンクされた回答には両方とも解決策が含まれていますが、オムニバスの回答があるとよいでしょう。
Postgresは強く型付けされています。その関数と演算子は特定の型を返します。
->コード> jsonbを返します。 SQLnullではなくjsonbnullと比較してください
。
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)
->>コード> テキストを返し、jsonbnullをSQLnullに変換します
。
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は単なる別の値ですが、SQLnullは非常に特殊であることに注意してください。ヌルは値ではなく、値の欠如です。 ヌルは何にも等しくなく、ヌルでさえありません 。 nullをjsonbにキャストするとjsonbnullが生成されるように見えるかもしれませんが、SQL標準では、nullはnullにのみキャストする必要があります。 そうでなければ、nullは何かと同等であることを意味します。
これが、jsonb nullをnullに変換できるが、nullがjsonbnullにキャストされない理由です。 null ::jsonb
nullです 。これは不便ですが、SQL標準で要求されています。これが、jsonbとテキストの間を行き来することが推奨されない理由の1つです。