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()函數直接能夠將輸出結果聚合成一個數組,而後按照數組使用。

相關文章
相關標籤/搜索