查询JSONtypes内的数组元素
我试图在PostgreSQL 9.3中testingjsontypes。 
 我有一个称为reports的json列称为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数组中查找元素的索引