อาร์เรย์แบบสอบถาม PostgreSQL JSON เทียบกับหลายค่า


18

ฉันต้องการเขียนแบบสอบถามกับjsonbประเภทใน 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"}'];

นี่คือสิ่งที่ฉันคาดหวังจากแบบสอบถามของฉัน:

กลุ่ม "แรก" -> ลูกค้า "1"

กลุ่ม "สาม" -> ลูกค้า "5"

คำตอบ:


17

มีวิธีคือ: รวมตัวดำเนินการบรรจุเข้า@>กับ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.