私はpostgresjsonb
列タイプを試していますが、これまでのところうまくいっています。私が使用している一般的なクエリの1つは、次のようなものです。
select count(*) from jsonbtest WHERE attributes @> '{"City":"Mesa"}';
どうすればそれを元に戻すことができますか?別の演算子がありますか、それとも単に次のように使用されますか
select count(*) from jsonbtest WHERE NOT attributes @> '{"City":"Mesa"}';
双方向で、任意のjson(b)値をテストできます
->>
_演算子は、値をテキストとして抽出します。ただし、値のみのテストを使用する場合、この操作は遅くなります@>
_オペレーターは、任意のjson(b)に任意のjson(b)が含まれていることをテストします。これは簡単ですが、オプションではテストされていません。簡単かつ迅速な方法:
_NOT (attribute @> '{"City":"Mesa"}'::jsonb)
_
_attribute->>'City' <> 'Mesa'
_をNOT (attribute @> '{"City":"Mesa"}'::jsonb)
に変更し、〜2.000.000行のクエリ結果時間が45秒から25秒に変更されました。
これは、いくつかの条件で達成できます。エレガントではありませんが、別の方法は見つかりませんでした。
したがって、最初に、単純に「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'))