Postgresql

針對多個值的 PostgreSQL JSON 查詢數組

  • April 11, 2021

我想針對jsonbPostgres 中的類型編寫一個查詢,給定一組客戶 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 數組的數組。

您可以為此使用索引:

手冊明確指出該運算符?|僅用於匹配鍵或數組元素的字元串*(不是值*):

文本數組中的任何字元串是否作為頂級鍵或數組元素存在?

引用自:https://dba.stackexchange.com/questions/130699