我正在为PostgreSQL 9.2中的新JSON函数寻找一些文档和/或示例.
具体来说,给定一系列JSON记录:
[
{name: "Toby", occupation: "Software Engineer"},
{name: "Zaphod", occupation: "Galactic President"}
]
Run Code Online (Sandbox Code Playgroud)
如何编写SQL以按名称查找记录?
在vanilla SQL中:
SELECT * from json_data WHERE "name" = "Toby"
Run Code Online (Sandbox Code Playgroud)
官方开发手册非常稀少:
我已经汇总了详细介绍PostgreSQL 9.2目前可能实现的内容.使用一些自定义函数,可以执行以下操作:
SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';
Run Code Online (Sandbox Code Playgroud)
我现在已将我的JSON函数移动到他们自己的项目中:
PostSQL - 一组用于将PostgreSQL和PL/v8转换为完全令人敬畏的JSON文档存储的函数
我在文档中找不到这个问题的明确答案.如果列是数组类型,是否会对所有输入的值进行单独索引?
我创建了一个包含一int[]列的简单表,并在其上放置了一个唯一索引.我注意到我无法添加相同的整数数组,这使我相信索引是数组项的组合,而不是每个项的索引.
INSERT INTO "Test"."Test" VALUES ('{10, 15, 20}');
INSERT INTO "Test"."Test" VALUES ('{10, 20, 30}');
SELECT * FROM "Test"."Test" WHERE 20 = ANY ("Column1");
Run Code Online (Sandbox Code Playgroud)
索引是否有助于此查询?
我有一个看起来像这样的表:
CREATE TABLE tracks (id SERIAL, artists JSON);
INSERT INTO tracks (id, artists)
VALUES (1, '[{"name": "blink-182"}]');
INSERT INTO tracks (id, artists)
VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Run Code Online (Sandbox Code Playgroud)
还有其他几个与此问题无关的列.将它们存储为JSON是有原因的.
我要做的是查找具有特定艺术家姓名(完全匹配)的曲目.
我正在使用此查询:
SELECT * FROM tracks
WHERE 'ARTIST NAME' IN
(SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)
例如
SELECT * FROM tracks
WHERE 'The Dirty Heads' IN
(SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)
但是,这会进行全表扫描,并且速度不是很快.我尝试使用函数创建GIN索引names_as_array(artists)并使用'ARTIST NAME' = ANY names_as_array(artists),但是不使用索引并且查询实际上明显更慢.