2 回答
TA贡献1725条经验 获得超7个赞
json 在Postgres 9.3+
使用子句json_array_elements()中的横向连接中的函数来对JSON数组进行Unnest FROM并测试其元素:
WITH reports(data) AS (
VALUES ('{"objects":[{"src":"foo.png"}, {"src":"bar.png"}]
, "background":"background.png"}'::json)
)
SELECT *
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
该CTE(WITH查询)只是替代了一张桌子reports。
或者,相当于只是一个单一的嵌套层次:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->>,->和#>运营商的说明书中介绍。
两个查询都使用隐式JOIN LATERAL。
SQL小提琴。
密切相关的答案:
在JSON列中查询数组元素
jsonb 在Postgres 9.4+
使用等效的jsonb_array_elements()。
更好的是,使用新的“包含”运算符@>(最好结合表达式上匹配的GIN索引data->'objects'):
CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);
SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';
由于密钥objects包含JSON 数组,因此我们需要匹配搜索项中的结构并将数组元素包装到方括号中。搜索普通记录时删除数组括号。
详细说明和更多选项:
用于在JSON数组中查找元素的索引
添加回答
举报