json
在Postgres 9.3+中
json_array_elements()通过
FROM子句中的横向联接将函数与JSON数组嵌套在一起,并测试其元素:
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';
->>,
->以及
#>操作符在手册中进行了说明。
这两个查询都使用隐式
JOINLATERAL。
SQL提琴。
jsonb
在Postgres 9.4+
使用等效项
jsonb_array_elements()。
更好的 是,使用新的“ contains”运算符
@>(最好与表达式上匹配的GIN索引结合使用
data->'objects'):
CREATE INDEX reports_data_gin_idx ON reportsUSING gin ((data->'objects') jsonb_path_ops);SELECt * FROM reports WHERe data->'objects' @> '[{"src":"foo.png"}]';由于键
objects包含一个JSON 数组 ,因此我们需要匹配搜索项中的结构并将数组元素也包装在方括号中。搜索纯记录时,请放下数组括号。



