web-dev-qa-db-ja.com

Postgres jsonb '含まれていません'演算子

私はpostgresjsonb列タイプを試していますが、これまでのところうまくいっています。私が使用している一般的なクエリの1つは、次のようなものです。

select count(*) from jsonbtest WHERE attributes @> '{"City":"Mesa"}';

どうすればそれを元に戻すことができますか?別の演算子がありますか、それとも単に次のように使用されますか

select count(*) from jsonbtest WHERE NOT attributes @> '{"City":"Mesa"}';
15
user101289

双方向で、任意のjson(b)値をテストできます

  • _->>_演算子は、値をテキストとして抽出します。ただし、値のみのテストを使用する場合、この操作は遅くなります
  • _@>_オペレーターは、任意のjson(b)に任意のjson(b)が含まれていることをテストします。これは簡単ですが、オプションではテストされていません。

簡単かつ迅速な方法:

_NOT (attribute @> '{"City":"Mesa"}'::jsonb)
_

_attribute->>'City' <> 'Mesa'_をNOT (attribute @> '{"City":"Mesa"}'::jsonb)に変更し、〜2.000.000行のクエリ結果時間が45秒から25秒に変更されました。

8

これは、いくつかの条件で達成できます。エレガントではありませんが、別の方法は見つかりませんでした。

したがって、最初に、単純に「City」属性を持たないすべての行を取得してから、「OR」条件を追加して、正しいフィールド値を確認します。

select count(*) from jsonbtest where 
  NOT(attributes ? 'City') 
  OR (attributes ? 'City') is NULL -- this is required if attributes can be null
  OR (attributes->>'City' != 'Mesa')) 
3
Dmitry Chirkin