PostgreSQL JSON array permintaan terhadap beberapa nilai

16

Saya ingin menulis kueri terhadap jsonbtipe Postgres yang memberikan array ID pelanggan akan menemukan grup yang sesuai.

Diberikan tabel contoh ini:

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"}]}');

Saya menemukan pertanyaan serupa ( PostgreSql JSONB SELECT terhadap beberapa nilai ) dan berhasil mencapai apa yang saya inginkan pada array sederhana menggunakan kueri ini:

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

Namun, saya tidak bisa membuatnya berfungsi ketika ketika array berisi objek JSON :

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

Inilah yang saya harapkan dari permintaan saya:

grp "Pertama" -> pelanggan "1"

grp "Ketiga" -> pelanggan "5"

BartZ
sumber

Jawaban:

15

Ada caranya: gabungkan operator kontainmen@> dengan ANYkonstruk :

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

Atau:

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

Sangat penting untuk menggunakan array jsonb[]secara eksplisit. Dan perhatikan bahwa setiap elemen adalah array JSON di dalam seperti yang @>dibutuhkan operator . Jadi ini adalah array dari array JSON.

Anda dapat menggunakan indeks untuk ini:

The pengguna secara eksplisit menyatakan bahwa operator ?|adalah untuk string saja.

Erwin Brandstetter
sumber