2015-05-28 169 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)。 –