sql >> データベース >  >> RDS >> PostgreSQL

plpgsqlでjsonbnullを識別するためのベストプラクティス

    リンクされた回答には両方とも解決策が含まれていますが、オムニバスの回答があるとよいでしょう。

    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つです。



    1. 複数のサーバー間でMysqlを分割する方法は?

    2. mysqlで緯度と経度を使用して2点間の距離を検索します

    3. MySQLで再帰的な自己結合を行う方法

    4. 1つのコマンドで行を選択または挿入する