Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209939
  • 博文数量: 21
  • 博客积分: 1546
  • 博客等级: 上尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-10 14:54
文章分类

全部博文(21)

文章存档

2020年(1)

2019年(3)

2015年(2)

2014年(1)

2011年(1)

2009年(7)

2008年(4)

2007年(2)

我的朋友

分类:

2008-04-21 16:07:00

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聚集函数,但可以自定义聚集函数,所以可以容易的实现这功能。
 
自定义聚集函数array_accum
 
CREATE AGGREGATE array_accum (anyelement)
(
    sfunc = array_append, -- 每行的操作函数,将本行append到数组里 
    stype = anyarray,  -- 聚集后返回数组类型 
    initcond = '{}'    -- 初始化空数组
);
 
参数anyelement匹配任何类型,聚集后返回数组类型anyarray,该函数的功能是将每行的记录附加到数组里。
 
SELECT id, array_accum(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(array_accum(name),',') from xxx group by id
就可以得到group_concat相同的结果了。
 
但MySQL的group_concat的功能很强,比如可以排序等,postgresql若要模拟它,只能自己定义一个增强型的函数比如array_to_string_plus,可以对数组进行排序后再concat,这里就不用多述,留给各位动脑筋吧。
 
阅读(4287) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~