我正在尝试测试json
PostgreSQL 9.3中的类型。
我在json
名为data
的表中有一个列reports
。JSON看起来像这样:
{
"objects": [
{"src":"foo.png"},
{"src":"bar.png"}
],
"background":"background.png"
}
我想查询表中所有与“对象”数组中“ src”值匹配的报告。例如,是否可以在数据库中查询所有匹配的报告'src' = 'foo.png'
?我成功地写了一个查询,可以匹配"background"
:
SELECT data AS data FROM reports where data->>'background' = 'background.png'
但是由于"objects"
具有一组值,所以我似乎无法编写出有效的东西。是否可以在数据库中查询所有匹配的报告'src' = 'foo.png'
?我已经查看了这些来源,但仍然无法了解:
我也尝试过类似的方法,但无济于事:
SELECT json_array_elements(data->'objects') AS data from reports
WHERE data->>'src' = 'foo.png';
我不是SQL专家,所以我不知道我做错了什么。
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';
->>
,->
以及#>
操作符在手册中进行了说明。
这两个查询都使用隐式JOIN LATERAL
。
SQL提琴。
jsonb
在Postgres 9.4+使用等效项jsonb_array_elements()
。
更好的 是,使用新的“ contains”运算符@>
(最好与表达式上匹配的GIN索引结合使用data->'objects'
):
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 数组 ,因此我们需要匹配搜索项中的结构并将数组元素也包装在方括号中。搜索纯记录时,请放下数组括号。
我试图测试PostgreSQL 9.3中的类型。 我在一个名为的表中有一个名为的列。JSON如下所示: 我想查询表中与'objects'数组中的'src'值匹配的所有报告。例如,是否可以查询数据库中匹配的所有报告?我成功地编写了一个可以匹配的查询: null 我不是SQL专家,所以我不知道我做错了什么。
我尝试使用函数JSON\u array\u elements()卸载JSON数组,并尝试使用JSON\u array\u length(field\u name)计算数组的元素,但没有成功。我使用的是PostgreSQL 9.4.5。 我想查询元素“name”的结果,这是json类型数组field crew | json[]上保存的数据。
最近升级到使用PostgreSQL 9.3.1来利用JSON功能。在我的表中,我有一个json类型列,其结构如下: 就问题而言,这只是虚拟数据。 是否可以根据id查询电子邮件数组中的特定项目 差不多:“返回id=123的电子邮件)”?
您将如何在存储在列中的数组中搜索元素?(更新:另请参阅列的9.4更新答案。) 如果我有这样一个JSON文档,存储在名为blob的列中: 我想做的是: 并取出所有匹配的行。但这不起作用,因为
问题内容: 最近升级到使用PostgreSQL 9.3.1来利用JSON功能。在我的表中,我有一个json类型列,其结构如下: 就问题而言,这只是伪数据。 是否可以根据id在emails数组中查询特定项目? 差不多:“返回电子邮件,其中id = 123)”? 问题答案: 是的,这是可能的: 是您的表名,是JSON列的名称。
问题内容: 我正在使用Postgres的json数据类型,但想对嵌套在json中的数据进行查询/排序。 我想订购或查询json数据类型上的.where。例如,我要查询关注者计数> 500的用户,或者要按关注者或关注计数进行订购。 谢谢! 例: 问题答案: 对于任何偶然发现的人。我想出了一个使用ActiveRecord和Postgres的JSON数据类型的查询列表。随时对其进行编辑以使其更加清晰。