postgresql 聚合函数 的编写

PostgreSQL功能很强大,支持事务,嵌套SQL,触发器,聚合等等几乎全部的商业数据库的功能,不得不佩服他还免费,我我的以为MySQL不如它。别人老说PostggreSQL慢,其实维护得好,SQL写得合理,性能和MySQL有过之而无不及。sql

言归正传,我前段时间用PostgreSQL来作一个功能,就是想把某个表里面的某个字符型字段的值用逗号隔开“汇总”起来。实现这个功能能够在编程层次上把全部的行列出来,而后拼凑起来,这样的方法是傻子才用,数据量一大性能就不用说了。数据库

我想应该有相似postgres的内嵌函数sum的函数,只是此次sum是汇总字符串而已。因而发现有个聚合函数能够自编的,看了一下Help,很简单。编程

因而先建立一个函数:数组

CREATE OR REPLACE FUNCTION concat(text, text)
RETURNS text AS
$BODY$
DECLARE
t text;
BEGIN
IF character_length($1) > 0 THEN
t = $1 ', ' $2;
ELSE
t = $2;
END IF;
RETURN t;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION concat(text, text) OWNER TO postgres;
GRANT EXECUTE ON FUNCTION concat(text, text) TO public;
GRANT EXECUTE ON FUNCTION concat(text, text) TO postgres;
这个函数很简单,就是把两个字符串用逗号拼起来。函数

而后建立一个聚合函数:post

CREATE AGGREGATE sumtext( 
BASETYPE=text, 
SFUNC=concat, 
STYPE=text);
ALTER AGGREGATE sumtext(text) OWNER TO postgres;性能

而后,你就能够用这个sumtext来作了,相似与sum, average,max之类:spa

SELECT sumtext(hexiaoren_qm) FROM cw_hexiaojilu;事务

结果就是你想获得的东西了。字符串


后来发现,其实不必本身写这么多东西,ARRAY_AGG()函数直接能够将输出结果聚合成一个数组,而后按照数组使用。

相关文章
相关标签/搜索