我不知道是否有一些簡單的方法(我希望如此),但這個工程(PostgreSQL沒有數組的數組,所以array_agg
形式給出不在這裏工作了):
CREATE OR REPLACE FUNCTION func()
RETURNS int[] AS $$
DECLARE
arr int[];
res int[];
n int;
BEGIN
res := '{{0, 0}}';
FOR arr IN SELECT t FROM tbl_foo
LOOP
res := res || arr;
END LOOP;
n := array_length(res, 1);
RETURN res[2:n];
END $$
LANGUAGE 'plpgsql';
例子:
CREATE TABLE tbl_foo (id serial, t int[]);
INSERT INTO tbl_foo (t) VALUES
('{1, 2}'),
('{5, 2}'),
('{6, 2}'),
('{1, 7}'),
('{1, 8}'),
('{1, 9}');
SELECT func();
func
---------------------------------------
{{1,2},{5,2},{6,2},{1,7},{1,8},{1,9}}
(1 row)
編輯:
第二種解決方案是基於新的聚集函數,稱爲讓我們說array2_agg
:
CREATE OR REPLACE FUNCTION array2_agg_cutFirst(res anyarray)
RETURNS anyarray AS $$
BEGIN
RETURN res[2:array_length(res, 1)];
END $$
LANGUAGE 'plpgsql';
CREATE AGGREGATE array2_agg(anyarray)
(
SFUNC = array_cat,
STYPE = anyarray,
FINALFUNC = array2_agg_cutFirst,
INITCOND = '{{0, 0}}'
);
SELECT array2_agg(t) FROM tbl_foo;
array2_agg
---------------------------------------
{{1,2},{5,2},{6,2},{1,7},{1,8},{1,9}}
(1 row)
我需要array2_agg_cutFirst
功能(簡單地切割第一'{0, 0}'
子陣列),因爲INITCOND = '{{}}'
是不允許的。
我添加了第二個基於自定義聚合的解決方案,我認爲它比純粹的函數更好。 –