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,這里就不用多述,留給各位動腦筋吧。