MySQL有個聚集合函式group_concat, 它可以按group的id,將欄位串聯起來,如
表:
id name
---------------
1 A
2 B
1 B
SELECT id, group_concat(name) from xxx group by id
得出的結果為
id group_concat(name)
---------------------------
1 A,B
2 B
PostgreSQL沒有現成的group_concat聚集合函式,但可以自訂聚集合函式,所以可以容易的實現這功能。
自訂聚集合函式 group_concat
CREATE AGGREGATE group_concat(anyelement)
(
sfunc = array_append, -- 每行的操作函數,將本行append到數組裡
stype = anyarray, -- 聚集後返回數群組類型
initcond = '{}' -- 初始化空數組
);
參數anyelement匹配任何類型,聚集後返回數群組類型anyarray,該函數的功能是將每行的記錄附加到數組裡。
SELECT id, group_concat(name) from xxx group by id
得出的結果為
id array_accum(name)
---------------------------
1 {'A','B'}
2 {'B'}
array_accum(name)為數群組類型,再用array_to_string函數將數群組轉換為字串
SELECT id, array_to_string(group_concat(name),',') from xxx group by id
就可以得到group_concat相同的結果了。
但MySQL的group_concat的功能很強,比如可以排序等,postgresql若要類比它,只能自己定義一個增強型的函數比如array_to_string_plus,可以對數組進行排序後再concat,這裡就不用多述,留給各位動腦筋吧。