2015-05-28 170 views
2

内我有一个匹配表以下数据: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]} 

最后,我想获得的独特的团队名称的列表。

This Question我一直在尝试使用下面的访问团队Name属性:

SELECT json_array_elements(match->>'Teams') FROM matches 

这将返回

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 

我也试过json_array_elements(比赛 - >> '团队': :json)和json_array_elements(to_json(match - >>'Teams'))无济于事。

但下面的查询

SELECT match->>'Teams' FROM matches; 

返回

"[{"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"}]}]" 

回答

4

->>经营者给你的结果作为text,但你希望它保持json。使用->,它给你json值。

编号:http://www.postgresql.org/docs/9.4/static/functions-json.html

相信操作上json_array_elements(match->>'Teams'::json)顺序转换Teamsjson运行->>之前。 json_array_elements((match->>'Teams')::json)应该可以工作,但只是->的一个环岛版本。

to_json(match->>'Teams')转换为text,然后为您提供该文本作为json对象。它不会将text解析回json

+0

哇,这么简单的修复。是否有任何理由使用文本版本? ( - >> over - >) – janderson

+1

有时候你想要文本,有时候你想要更多的JSON,完全取决于你的用例。当涉及NULL时有一些不同的行为 - 这里是一个[demo](http://sqlfiddle.com/#!15/4ba26/3)。 –