如何使用新的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是其中最有效的。

  • jsonjsonb数据类型和函数的手册。
  • 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-c​​an-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)