Mảng truy vấn JSON của PostgreSQL dựa trên nhiều giá trị


15

Tôi muốn viết một truy vấn đối với jsonbloại trong Postgres đưa ra một mảng ID khách hàng sẽ tìm thấy các nhóm tương ứng.

Cho bảng ví dụ này:

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

Tôi đã tìm thấy câu hỏi tương tự ( PostgreSql JSONB CHỌN đối với nhiều giá trị ) và quản lý để đạt được những gì tôi muốn trên mảng đơn giản bằng truy vấn này:

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

Tuy nhiên, tôi không thể làm cho nó hoạt động khi mảng chứa các đối tượng JSON :

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

Đây là những gì tôi mong đợi từ truy vấn của tôi:

grp "Đầu tiên" -> khách hàng "1"

grp "Thứ ba" -> khách hàng "5"

Câu trả lời:


15

Có một cách: kết hợp toán tử ngăn chặn@> với ANYcấu trúc :

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

Hoặc là:

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

Đó là điều cần thiết để truyền mảng jsonb[]một cách rõ ràng. Và lưu ý rằng mỗi phần tử là một mảng JSON bên trong giống như toán tử @>yêu cầu. Vì vậy, đó là một mảng các mảng JSON.

Bạn có thể sử dụng một chỉ mục cho việc này:

Các nhãn hiệu rõ ràng khẳng định rằng các nhà điều hành ?|là cho dây chỉ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.