2016-08-18 63 views
3

JSON對象值I有一個具有內容與此類似一個Postgres表:提取密鑰,從在Postgres的

id | data 

1 | {"a":"4", "b":"5"} 
2 | {"a":"6", "b":"7"} 
3 | {"a":"8", "b":"9"} 

第一列是一個整數,第二個是一個JSON柱。

我希望能夠從JSON擴大了鍵和值因此結果是這樣的:

id | key | value 

1 | a | 4 
1 | b | 5 
2 | a | 6 
2 | b | 7 
3 | a | 8 
3 | b | 9 

可這在Postgres的SQL可以實現嗎?


我已經試過

鑑於原始表可以模擬這樣:

select * 
from 
(
values 
(1, '{"a":"4", "b":"5"}'::json), 
(2, '{"a":"6", "b":"7"}'::json), 
(3, '{"a":"8", "b":"9"}'::json) 
) as q (id, data) 

我可以用得到的只是按鍵:

select id, json_object_keys(data::json) 
from 
(
values 
(1, '{"a":"4", "b":"5"}'::json), 
(2, '{"a":"6", "b":"7"}'::json), 
(3, '{"a":"8", "b":"9"}'::json) 
) as q (id, data) 

我可以將它們記錄爲這樣的記錄集:

select id, json_each(data::json) 
from 
(
values 
(1, '{"a":"4", "b":"5"}'::json), 
(2, '{"a":"6", "b":"7"}'::json), 
(3, '{"a":"8", "b":"9"}'::json) 
) as q (id, data) 

但我不能解決如何使用id,key和value來實現結果。

任何想法?

注意:我正在使用的真正的json比這更嵌套,但我認爲這個例子很好地代表了我的潛在問題。

+0

可能的重複[如何將postgresql 9.4 jsonb轉換爲沒有函數/服務器端語言的對象](http://stackoverflow.com/questions/27181980/how-to-convert-postgresql-9-4-jsonb-to -object-without-function-server-side-langu) – e4c5

+0

使用函數'json_object_keys'或'json_each'作爲表,而不是列:'select id,j.key,j.value from my_table,json_each(data)j' – Abelisto

+0

謝謝Abelisto。當然,我最終會得到一個完整的笛卡爾產品,而不是我正在尋找的表格,使用您建議的查詢? –

回答

6
SELECT q.id, d.key, d.value 
FROM q 
JOIN json_each_text(q.data) d ON true 
ORDER BY 1, 2; 

函數json_each_text()是一個返回函數集,所以您應該將它用作行來源。該函數的輸出在此爲joined laterally至表q,這意味着對於表中的每一行,來自data列的每個(key, value)對都只連接到該行,因此原始行與由json對象形成的行之間的關係保持。

q也可以是一個非常複雜的子查詢(或VALUES子句,就像你的問題)。在該函數中,根據評估該子查詢的結果使用適當的列,因此僅使用對子查詢的別名和子查詢中的(別名)列的引用。

+0

謝謝帕特里克。我仍然對我如何適應我原來的查詢有點困惑。我使用'WITH'語句來定義'q'嗎? –

+0

無需WITH語句就可以實現嗎? –

+0

'q'是你所指的表,你用它作爲原始表的代理。 – Patrick