我如何使用新的PostgreSQL JSON数据类型内部的字段进行查询?
我如何使用新的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
更新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+,只需使用->
运算符。例如,
SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;
查看http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/,了解一些不错的例子和教程。
Postgres 9.2
我引用了 Andrew Dunstan 在 pgsql-hackers 列表上的话:
在某些情况下,可能会有一些 json 处理函数(与 json 生成函数不同),但不会在9.2版本中出现。
这并不妨碍他提供一个在 PLV8 中解决问题的示例实现。(链接现在已经失效,看看现代的PLV8)。
Postgres 9.3
新增了许多新功能和运算符,以添加“json 处理”。
在 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
(b表示“二进制”,值存储为本机的 Postgres 类型)和两种类型的更多功能。除了上面提到的表达式索引之外,jsonb
还支持GIN、btree 和 hash 索引,其中 GIN 是最强大的。
该手册甚至建议:
一般情况下,大多数应用程序应该将 JSON 数据存储为
jsonb
,除非有相当专业的需求,比如关于对象键排序的传统假设。
我强调加粗。
Postgres 9.5
完整的jsonb
函数和操作符。新增更多用于就地操作和呈现jsonb
数据的函数。