我正在为PostgreSQL 9.2中的新JSON函数寻找一些文档和/或示例。
具体来说,给定一系列JSON记录:
[
{name: "Toby", occupation: "Software Engineer"},
{name: "Zaphod", occupation: "Galactic President"}
]
如何编写SQL以按名称查找记录?
在vanilla SQL中:
SELECT * from json_data WHERE "name" = "Toby"
官方开发手册非常稀疏:
我整理了一个gist detailing what is currently possible with PostgreSQL 9.2。 使用一些自定义函数,可以执行以下操作:
SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';
我现在已将我的JSON函数移动到他们自己的项目中:
PostSQL - 一组用于将PostgreSQL和PL / v8转换为完全令人敬畏的JSON文档存储的函数
答案 0 :(得分:167)
我引用Andrew Dunstan on the pgsql-hackers list:
在某个阶段可能会有一些json处理(相反 到json-producing)函数,但不在9.2中。
不妨碍他提供解决问题的example implementation in PLV8。
提供一系列新功能和操作员来添加“json-processing”。
Postgres 9.3中原始问题的答案:
SELECT *
FROM json_array_elements(
'[{"name": "Toby", "occupation": "Software Engineer"},
{"name": "Zaphod", "occupation": "Galactic President"} ]'
) AS elem
WHERE elem->>'name' = 'Toby';
高级示例:
对于较大的表,您可能需要添加表达式索引以提高性能:
添加 jsonb
(b表示“二进制”,值存储为本机Postgres类型),还有两种类型的更多功能。除了上面提到的表达式索引,jsonb
还支持GIN, btree and hash indexes,GIN是其中最有效的。
本手册指出:
通常,大多数应用程序都应该优先将JSON数据存储为
jsonb
,除非有非常专业的需求,例如遗产 关于对象键排序的假设。
大胆强调我的。
Performance benefits from general improvements to GIN indexes.
完成jsonb
个函数和运算符。添加更多功能来操作jsonb
到位并显示。
答案 1 :(得分:78)
使用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/了解一些不错的示例和教程。
答案 2 :(得分:16)
使用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
rails 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)