postgresql如何实现group_concat功能

MySQL有个聚集函数group_concat, 它可以按group的id,将字段串联起来,如表:

<span style="font-size:14px;"><span style="font-size:14px;">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</span></span>

PostgreSQL没有现成的group_concat聚集函数,但可以自定义聚集函数,所以可以容易的实现这功能。

自定义聚集函数 group_concat
CREATE AGGREGATE group_concat(anyelement)
(
sfunc = array_append, -- 每行的操作函数,将本行append到数组里
stype = anyarray, -- 聚集后返回数组类型
initcond = '{}' -- 初始化空数组
);

参数anyelement匹配任何类型,聚集后返回数组类型anyarray,该函数的功能是将每行的记录附加到数组里。

<span style="font-size:14px;">SELECT id, group_concat(name) from xxx group by id
得出的结果为
id array_accum(name)
---------------------------
1 {'A','B'}
2 {'B'}</span>
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,这里就不用多述,留给各位动脑筋吧。




附表:Table 9-36. array 函数

函数返回类型描述例子结果
array_cat (anyarray,anyarray)anyarray连接两个数组array_cat(ARRAY[1,2,3], ARRAY[4,5]){1,2,3,4,5}
array_append(anyarray,anyelement)anyarray向一个数组末尾附加一个元素array_append(ARRAY[1,2], 3){1,2,3}
array_prepend(anyelement,anyarray)anyarray向一个数组开头附加一个元素array_prepend(1, ARRAY[2,3]){1,2,3}
array_dims (anyarray)text返回一个数组维数的文本表现array_dims(ARRAY[[1,2,3], [4,5,6]])[1:2][1:3]
array_lower (anyarray,int)int返回指定的数组维数的下界array_lower(array_prepend(0, ARRAY[1,2,3]), 1)0
array_upper (anyarray,int)int返回指定数组维数的上界array_upper(ARRAY[1,2,3,4], 1)4
array_to_string (anyarray,text)text使用提供的分隔符连接数组元素array_to_string(ARRAY[1, 2, 3], '~^~')1~^~2~^~3
string_to_array (text,text)text[]使用指定的分隔符把字串分裂成数组元素string_to_array('xx~^~yy~^~zz', '~^~'){xx,yy,zz}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值