查询JSONtypes内的数组元素

我试图在PostgreSQL 9.3中testingjsontypes。
我有一个称为reportsjson列称为data 。 JSON看起来像这样:

 {"objects":[{"src":"foo.png"},{"src":"bar.png"}],"background":"background.png"} 

我想查询表中所有与“对象”数组中的“src”值相匹配的报告。 例如,是否可以查询所有与'src' = 'foo.png'匹配'src' = 'foo.png'报表的DB? 我成功地写了一个可以匹配"background"的查询:

 SELECT data AS data FROM reports where data->>'background' = 'background.png' 

但是由于"objects"具有一系列的价值,我似乎无法写出一些有效的东西。 是否有可能查询所有符合'src' = 'foo.png' ? 我已经通过这些来源,但仍然无法得到它:

  • http://www.postgresql.org/docs/9.3/static/functions-json.html
  • 如何使用新的PostgreSQL JSON数据types中的字段进行查询?
  • http://michael.otacoo.com/postgresql-2/postgres-9-3-feature-highlight-json-operators/

我也尝试过这样的事情,但无济于事:

 SELECT json_array_elements(data->'objects') AS data from reports WHERE data->>'src' = 'foo.png'; 

我不是SQL专家,所以我不知道我在做什么错。

json在Postgres 9.3+

FROM子句的横向连接json_array_elements()函数json_array_elements() JSON数组,并testing其元素:

 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()

更好的是,使用新的“contains”运算符@> (最好与expression式data->'objects'上的匹配GIN索引结合使用):

 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 数组 ,因此我们需要在search词中匹配结构,并将数组元素包装到方括号中。 search普通logging时,放置数组括号。

详细的解释和更多的select:

  • 在JSON数组中查找元素的索引