Postgres json类型内部查询
Postgres json类型内部查询
我正在寻找一些关于PostgreSQL 9.2中新的JSON函数的文档和/或示例。
具体而言,给定一系列的JSON记录:
[ {name: "Toby", occupation: "软件工程师"}, {name: "Zaphod", occupation: "银河总统"} ]
我该如何编写SQL来通过名称查找记录?
在普通的SQL中:
SELECT * from json_data WHERE "name" = "Toby"
官方开发手册非常简洁:
- http://www.postgresql.org/docs/devel/static/datatype-json.html
- http://www.postgresql.org/docs/devel/static/functions-json.html
更新 I
我整理了一个Gist,详细介绍了在PostgreSQL 9.2中当前可能的操作。
使用一些自定义函数,可以做到以下操作:
SELECT id, json_string(data,'name') FROM things WHERE json_string(data,'name') LIKE 'G%';
更新 II
我现在将我的JSON函数移入了自己的项目中:
PostSQL - 一组用于将PostgreSQL和PL/v8转换为非常出色的JSON文档存储的函数
问题的原因是在使用Postgres 9.3+中的json类型时,查询语句中的操作符使用错误。解决方法是使用正确的操作符来查询json类型的数据。
在上述示例中,使用了->
操作符来查询数据。例如,SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;
。可以参考http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/了解更多有关Postgres和json的示例和教程。
在上述示例中,假设有一个名为data
的字段,其中包含一个JSON文档:{images:{thumbnail:{url:'thumbnail.jpg'}}}
。请告知您的数据长什么样,以及哪个查询语句出错了。
这个问题的解决方法是使用正确的操作符来查询json类型的数据。在查询中,如果存在数组,可以使用#>>
操作符来查询。例如:SELECT data->'%'->'thumbnail'->'url' AS thumb FROM instagram;
。
另外,答案中提到的方法也很有效,不需要像其他帖子中描述的那样使用::json
。需要注意的是,如果尝试访问不存在的属性(即如果有嵌套的JSON),->
操作符会抛出错误:ERROR: column "jsonPropertyYouWant" does not exist
。
问题的原因是在Postgres 9.2版本中,尽管没有提供json处理函数,但Andrew Dunstan在pgsql-hackers的邮件列表中提供了一个示例实现,用于解决这个问题。
解决方法是在Postgres 9.3版本中引入了一系列新的函数和运算符来添加"json-processing"功能。通过使用json_array_elements函数,可以将json数组的元素作为表的行返回,并可以在查询中使用WHERE子句过滤元素。下面是在Postgres 9.3中回答原始问题的示例查询:
SELECT *
FROM json_array_elements(
'[{"name": "Toby", "occupation": "Software Engineer"},
{"name": "Zaphod", "occupation": "Galactic President"} ]'
) AS elem
WHERE elem->>'name' = 'Toby';
在Postgres 9.4版本中,添加了jsonb类型(二进制,值以原生Postgres类型存储),并为两种类型增加了更多功能。除了上述提到的表达式索引之外,jsonb还支持GIN、btree和hash索引,其中GIN是其中最强大的。根据Postgres的手册建议,大多数应用程序应该优先将JSON数据存储为jsonb类型。
在Postgres 9.5版本中,完善了jsonb的函数和运算符,并添加了更多用于处理jsonb的函数。
Postgres在9.2、9.3、9.4和9.5版本中分别引入了json处理功能,并不断增加了新的函数和运算符来方便处理json数据。这些新增功能为开发人员提供了更多灵活性和效率。
问题的出现原因是Postgres 9.3中使用箭头符号"->"来访问json对象。在给出的示例中,使用了这个符号来访问json数据中的特定字段。
解决方法是在SQL查询中使用箭头符号来指定要访问的json字段。在给出的示例中,使用了"->"来访问json数据中的"params"字段,并且使用"->"继续嵌套访问json数组中的第一个元素的"type"字段。
以下是整理后的
在Postgres 9.3中,可以使用箭头符号"->"来访问json对象。在给出的示例中,我们可以看到如何使用这个符号来访问json数据中的特定字段。
首先,在seed.rb文件中,我们创建了一个SmartElement对象,并设置了其data字段的值为一个json对象。这个json对象包含了一个名为"params"的字段,它的值是一个包含两个json对象的数组。每个json对象都有"type"、"code"、"value"和"description"字段。
然后,我们保存了这个SmartElement对象。
接下来,在rails c中,我们使用SQL查询来访问这个SmartElement对象的data字段。我们使用箭头符号"->"来指定要访问的json字段。在这个例子中,我们访问了"params"字段,并使用"->"继续嵌套访问json数组中的第一个元素。
执行这个查询后,我们可以看到返回的结果是一个包含了第一个json对象的数据。这个json对象包含了"type"、"code"、"value"和"description"字段的值。
我们还可以继续嵌套访问json对象的字段。在这个例子中,我们使用了"->"来访问第一个json对象中的"type"字段。执行这个查询后,我们可以看到返回的结果是"type"字段的值。
通过使用箭头符号"->",我们可以方便地在Postgres 9.3中访问和处理json数据。无论是访问json对象的字段,还是嵌套访问json数组中的元素,都可以通过使用箭头符号来实现。这为我们在使用Postgres数据库时处理json数据提供了很大的灵活性。