相关疑难解决方法(0)

PostgreSQL引入的JSONB解释

PostgreSQL刚刚推出了JSONB,它已经在黑客新闻上发展趋势.如果有人能够解释它与之前在PostgreSQL中出现的Hstore和JSON有何不同,那就太好了.它的优点和局限是什么?何时有人考虑使用它?

postgresql json nosql postgresql-json jsonb

304
推荐指数
9
解决办法
11万
查看次数

如何使用新的PostgreSQL JSON数据类型中的字段进行查询?

我正在为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)

更新II

我现在已将我的JSON函数移动到他们自己的项目中:

PostSQL - 一组用于将PostgreSQL和PL/v8转换为完全令人敬畏的JSON文档存储的函数

sql postgresql json postgresql-9.2 postgresql-9.3

208
推荐指数
3
解决办法
18万
查看次数

用于在JSON数组中查找元素的索引

我有一个看起来像这样的表:

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),但是不使用索引并且查询实际上明显更慢.

sql postgresql indexing json jsonb

74
推荐指数
1
解决办法
5万
查看次数

列表中的Postgres JSON查询

我在匹配表中有以下数据:

{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}

{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
Run Code Online (Sandbox Code Playgroud)

最终,我想获得一份独特的团队名单.

以下问题我一直在尝试使用以下方法访问Team Name属性:

SELECT json_array_elements(match->>'Teams') FROM matches
Run Code Online (Sandbox Code Playgroud)

这回来了

ERROR: function json_array_elements(text) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 1560
Run Code Online (Sandbox Code Playgroud)

我也试过json_array_elements(match - >>'Teams':: json)和json_array_elements(to_json(match - >>'Teams'))无济于事.

但是以下查询

SELECT match->>'Teams' FROM matches;
Run Code Online (Sandbox Code Playgroud)

返回

"[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}]"
"[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}]"
Run Code Online (Sandbox Code Playgroud)

postgresql json

2
推荐指数
1
解决办法
4497
查看次数