我正在测试PostgreSQL 9.3中的json
类型。
我在一个名为reports
的表中有一个名为data
的json
列。
{
"objects": [
{"src":"foo.png"},
{"src":"bar.png"}
],
"background":"background.png"
}
我想查询表中与'objects'数组中的'src'值匹配的所有报表。例如,是否可以查询DB中与'src' = 'foo.png'
匹配的所有报表?我成功地编写了一个可以匹配"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
- How do I query using fields inside the new PostgreSQL JSON datatype?
- 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';
我不是SQLMaven,所以我不知道我做错了什么。
2条答案
按热度按时间1tuwyuhd1#
jsonb
(在Postgres 9.4以上版本中)您 * 可以 * 使用与下面相同的查询,只是使用
jsonb_array_elements()
。而是将
jsonb
"contains"运算符@>
与表达式data->'objects'
上的匹配GIN索引结合使用:由于键
objects
包含一个JSON * array *,我们需要匹配搜索项中的结构,并将数组元素也括在方括号中,搜索普通记录时请去掉数组括号。更多说明和选项:
json
(在Postgres 9.3+中)在
FROM
子句的横向连接中使用函数json_array_elements()
取消嵌套JSON数组,并测试其元素:老SQLF
或者,对于仅 * 单 * 级嵌套,等效于:
->>
、->
和#>
操作符在手册中有解释。两个查询都使用隐式
JOIN LATERAL
。密切相关的:
7gcisfzg2#
创建一个列类型为json的表
现在我们插入json数据
现在,让我们执行一些查询来获取数据
您可能已经注意到结果以列表形式出现
现在,要仅检索值,只需使用
->>