Postgresql
針對多個值的 PostgreSQL JSON 查詢數組
我想針對
jsonb
Postgres 中的類型編寫一個查詢,給定一組客戶 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 against multiple values)並設法使用此查詢在簡單數組上實現了我想要的:
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 “第三” -> 客戶 “5”
有一種方法:將包含運算符
@>
與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 數組的數組。您可以為此使用索引:
該手冊明確指出該運算符
?|
僅用於匹配鍵或數組元素的字元串*(不是值*):文本數組中的任何字元串是否作為頂級鍵或數組元素存在?