複数の値に対するPostgreSQL JSONクエリ配列


16

jsonb顧客IDの配列に対応するグループが見つかるというPostgresのタイプに対するクエリを作成します。

この例の表を考えます:

CREATE TABLE grp(d JSONB NOT NULL);

INSERT INTO grp VALUES
   ('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}')
 , ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}')
 , ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}');

私は同様の質問(複数の値に対するPostgreSql JSONB SELECT)を見つけ、このクエリを使用して単純な配列で必要なものを達成することができました:

SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];

ただし、配列にJSON オブジェクトが含まれている場合は動作しません:

SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];

クエリに期待することは次のとおりです。

grp "最初"->顧客 "1"

grp "Third"->顧客 "5"

回答:


15

方法があります:包含演算子@>ANY構成体と組み合わせます:

SELECT d
FROM   grp
WHERE  d->'customers' @> ANY (ARRAY ['[{"id":"1"}]', '[{"id":"5"}]']::jsonb[]);

または:

...
WHERE d->'customers' @> ANY ('{"[{\"id\": \"1\"}]","[{\"id\": \"5\"}]"}'::jsonb[]);

配列をjsonb[]明示的にキャストすることが不可欠です。また、各要素は、オペレーターが必要とする内部のJSON 配列であることに注意してください@>。したがって、これはJSON配列の配列です。

これにはインデックスを使用できます。

マニュアルでは、明示的に述べて、オペレータがいること?|のためにある文字列のみ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.