2015-12-03 69 views
2

比方說,我有兩個表:加入的設置返回函數(json_array_elements)結果與表列

User_Combination

+--------+----------------+ 
| id | combination | 
+--------+----------------+ 
| 6 |  [1, 2]  | 
| 9 |  [2, 3]  | 
+--------+----------------+ 

顏色

+--------+----------------+ 
| id | color  | 
+--------+----------------+ 
| 1 |  Blue  | 
| 2 |  Yellow | 
| 3 |  Green | 
+--------+----------------+ 

我想加盟結果json_array_elements(color)與元素的id。例如,

select json_array_elements(color) as CombinationID 
from User_Combination where id = 6; 

結果是

+-------------------+ 
| CombinationID | 
+-------------------+ 
| 1    | 
| 2    | 
+-------------------+ 

我無法加入CombinationIDColors.id。當我嘗試SQL命令,例如:

select json_array_elements(article_data) AS articlesInOutfits (color) as CombinationID 
from User_Combination uc JOIN Colors co ON co.id = articlesInOutfits; 

select json_array_elements(article_data) AS articlesInOutfits (color) as CombinationID 
from User_Combination uc JOIN Colors co ON co.id = uc.articlesInOutfits; 

它說articlesInOutfits不存在。
有什麼建議嗎?

+1

你的Postgres的版本? –

+0

使用9.3.3。令人驚訝的是,unnest不起作用。 – NateW

+0

你能解決一些令你困惑的錯誤嗎? 'json_array_elements(color)'? 「元素」指的是什麼?顯示數據類型和約束的實際表格定義會更有用。 –

回答

3

使用unnest()得到解壓組合:

select id, unnest(combination) cid 
from user_combination; 

id | cid 
----+----- 
    6 | 1 
    6 | 2 
    9 | 2 
    9 | 3 
(4 rows)  

使用解壓cids加入與colors

select u.id, color 
from (
    select id, unnest(combination) cid 
    from user_combination 
    ) u 
join colors c 
on cid = c.id; 

id | color 
----+-------- 
    6 | Blue 
    6 | Yellow 
    9 | Yellow 
    9 | Green 
(4 rows) 

使用聚集函數(如json_agg())即可加入顏色彙總的對於用戶:

​​

如果combination的類型是json你應該使用在橫向json_array_elements()的加入:

select u.id, json_agg(color) 
from (
    select id, cid 
    from user_combination, 
    lateral json_array_elements(combination) cid 
    ) u 
join colors c 
on cid::text::int = c.id 
group by 1; 
+0

真棒,一秒鐘,我會試試看 – NateW

+0

我使用Postgres版本9.3.3,它說:錯誤:函數unnest(json)不存在 – NateW

+0

啊我看到了,我存儲一個數組作爲類型JSON。我會解決這個問題,然後嘗試unnest – NateW