Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5438238
  • 博文数量: 895
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8691
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(895)

文章存档

2021年(2)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Mysql/postgreSQL

2012-02-10 22:36:09

同事让帮忙搞定一个问题,从网上找了半天,终于发现用SQL搞定的简单办法。


  我们知道MySQL中有分类汇总函数GROUP_CONCAT来实现将组内相关值的连接,但是在PostgreSQL没有此类的函数,但是我们可以使用以下两种方法来方便的达到我们的目的:

  我们首先创建一个测试表,并插入一些测试数据:

create table test(id int,name varchar(100));
insert into test values(1,'aa');
insert into test values(1,'bb');
insert into test values(2,'cc');
insert into test values(3,'dd');
insert into test values(2,'ff');

  1.使用数组函数两组内的列表转换成数组

select id,array_to_string(
array(select name from test where id=a.id),',')
from test a
group by id;

  --结果

3 | dd
2 | cc,ff
1 | aa,bb

  是不是看起来非常的简单呢,呵呵,非常的cool!

  2.使用自定义的聚集函数

  PostgreSQL除了提供给我们的一些预定义函数之外,还有创建聚集函数的DDL语句,非常的灵活!

  --首先创建一个状态传递函数:实现将统计结果传递连接

create function pg_concat( text, text ) returns text as '
begin
if $1 isnull then
return $2;
else
return $1 || $2;
end if;
end;' language 'plpgsql';

  --创建一个最终的结果函数:实现将最后一个连接符号清除

create function pg_concat_fin(text) returns text as '
begin
return substr($1,1,length($1)-1);
end;' language 'plpgsql';

  --创建聚集函数,入口参数basetype:text,状态传递函数:pg_concat,状态变量类型:text,结果函数finalfunc:pg_concat_fin

create aggregate pg_concat (
basetype = text,
sfunc = pg_concat,
stype = text,
finalfunc = pg_concat_fin);

  --使用聚集函数进行统计:

select id,pg_concat(name||',')
from test
group by id;

  --结果

3 | dd
2 | cc,ff
1 | aa,bb

  和第一种方法得到的结果是一样的,非常的方便。


http://dev.21tx.com/2008/10/15/14206.html


阅读(3445) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~