我的桌子看起来像:
id | t ----+------- 1 | {1,2} 2 | {5,2} 3 | {6,2} 4 | {1,7} 5 | {1,8} 6 | {1,9}
我正在寻找一个SELECT查询,它会返回像{{1,2},{5,… {1,9}}这样的数组.
如果不是数组数据类型,那将很容易:
SELECT ARRAY (SELECT t from tbl_foo);
如果数据类型是int [],可以这样做吗?
解决方法
我不知道是否有一些更简单的方法(我希望如此),但这有效(Postgresql没有数组数组,所以array_agg aproach在这里不起作用):
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,('{6,('{1,7}'),8}'),9}'); SELECT func(); func --------------------------------------- {{1,{6,{1,7},8},9}} (1 row)
编辑:
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,9}} (1 row)
我需要array2_agg_cutFirst函数(简单地切割第一个'{0,0}’子阵列),因为INITCOND ='{{}}’是不允许的.