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