2016-09-28 10 views
5

私はpostgres jsonbの列の種類を試しています。私が使用している 一つの共通のクエリは、このようなものです:Postgres jsonb 'NOT contains' operator

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

は、どのように私はそれを逆にしますか?別の演算子があるか、それとも単純に使用されているか

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

ない場合、これは検索する演算子<@を使用することができません、そのための専用の演算子がありません。 「NOT」の何が問題なの? – redneb

+0

@redneb問題は、単に「NOT」が機能しないことです。 'attributes - >> 'City' <'' Mesa''の定式化を使うこともできません。 – eykanal

+0

@eykanal 'NOT' [かなりうまくいく](http://rextester.com/TMGVQZ95259)。 – pozs

答えて

1

これはいくつかの条件で実現できます。 それはエレガントではありませんが、そうする別の方法はありませんでした。

まず、単純な「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')) 
0

あなたは「市」が「メサ」

select count(*) from jsonbtest WHERE attributes <@ '{"City":"Mesa"}'; 
関連する問題