web-dev-qa-db-ja.com

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

Postgresのjsonbタイプに対するクエリを作成して、顧客IDの配列を指定すると、対応するグループを見つけることができます。

この例のテーブルを考えると:

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'];

ただし、配列にJSONobjectsが含まれている場合は機能しません。

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

これが私のクエリに期待することです:

grp "First"-> customer "1"

grp "サード"->顧客 "5"

18
BartZ

方法があります: 包含演算子@>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であることに注意してくださいarray演算子@>が必要とする内部。つまり、JSON配列の配列です。

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

マニュアルに明示的に示されている 演算子?|の対象はstringsのみ。

17