Bar*_*rtZ 27 postgresql array json postgresql-9.4
我想针对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"}]}');
Run Code Online (Sandbox Code Playgroud)
我发现了类似的问题(针对多个值的 PostgreSql JSONB SELECT)并设法使用此查询在简单数组上实现了我想要的:
SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];
Run Code Online (Sandbox Code Playgroud)
但是,当数组包含 JSON对象时,我无法使其工作:
SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];
Run Code Online (Sandbox Code Playgroud)
这是我对查询的期望:
grp“第一个”-> 客户“1”
grp "第三" -> 客户 "5"
Erw*_*ter 26
SELECT d
FROM grp
WHERE d->'customers' @> ANY (ARRAY ['[{"id":"1"}]', '[{"id":"5"}]']::jsonb[]);
Run Code Online (Sandbox Code Playgroud)
或者:
...
WHERE d->'customers' @> ANY ('{"[{\"id\": \"1\"}]","[{\"id\": \"5\"}]"}'::jsonb[]);
Run Code Online (Sandbox Code Playgroud)
必须jsonb[]
显式地将数组转换为。请注意,每个元素都是一个 JSON数组,内部包含一个对象,就像运算符@>
要求的那样。所以它是一个 JSON 数组数组。
您可以为此使用索引:
该手册明确指出该运算符?|
仅用于匹配键或数组元素的字符串(不是值):
文本数组中的任何字符串是否作为顶级键或数组元素存在?
归档时间: |
|
查看次数: |
45628 次 |
最近记录: |