如何使用新的PostgreSQL JSON数据类型中的字段进行查询?
我正在为PostgreSQL 9.2中的新JSON函数寻找一些文档和/或示例。
具体来说,给出一系列的JSON记录:
[ {name: "Toby", occupation: "Software Engineer"}, {name: "Zaphod", occupation: "Galactic President"} ]
我如何编写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
更新我
我已经汇总了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.2
我引用了pgsql-hacker名单上的Andrew Dunstan :
在某个阶段,可能会出现一些json处理(而不是json生成)的功能,但不是在9.2中。
不妨碍他在PLV8中提供一个可以解决您的问题的示例实现 。
Postgres 9.3
提供一系列新功能和运算符,以添加“json处理”。
- 新的JSON功能手册。
- Postgres维基于第9.3页的新特性 。
- @将在下面的评论中发布一个博客的链接, 展示新的运营商 。
Postgres 9.3中对原始问题的回答:
SELECT * FROM json_array_elements( '[{"name": "Toby", "occupation": "Software Engineer"}, {"name": "Zaphod", "occupation": "Galactic President"} ]' ) AS elem WHERE elem->>'name' = 'Toby';
先进的例子:
- 在JSON数据类型中查询与嵌套数组记录的组合
对于更大的表格,您可能需要添加表达式索引以提高性能:
- 在JSON数组中查找元素的索引
Postgres 9.4
添加jsonb
(b表示“二进制”,值存储为本机Postgres类型),还有更多的功能。 除了上面提到的表达式索引, jsonb
还支持GIN,btree和hash索引 ,GIN是其中最有效的。
-
json
和jsonb
数据类型和函数的手册。 - JSONB上的Postgres Wiki第9.4页
该手册甚至暗示:
一般来说, 大多数应用程序应该更喜欢将JSON数据存储为
jsonb
,除非有相当特殊的需求,比如对于对象键的排序的传统假设。
大胆重视我的。
性能受益于对GIN指标的一般改进。
Postgres 9.5
完成jsonb
函数和操作符。 添加更多的功能来操纵jsonb
就位和显示。
- Postgres 9.5发行说明中的重大好消息。
使用Postgres 9.3+,只需使用->
运算符。 例如,
SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;
看到http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/一些很好的例子和教程。;
用postgres 9.3使用 – >进行对象访问。 4例子
seed.rb
se = SmartElement.new se.data = { params: [ { type: 1, code: 1, value: 2012, description: 'year of producction' }, { type: 1, code: 2, value: 30, description: 'length' } ] } se.save
铁轨c
SELECT data->'params'->0 as data FROM smart_elements;
回报
data ---------------------------------------------------------------------- {"type":1,"code":1,"value":2012,"description":"year of producction"} (1 row)
你可以继续嵌套
SELECT data->'params'->0->'type' as data FROM smart_elements;
返回
data ------ 1 (1 row)