数组 – postgresql:选择数组
发布时间:2020-12-13 15:55:37 所属栏目:百科 来源:网络整理
导读:我的桌子看起来像: 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); 如
我的桌子看起来像:
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) 编辑: 第二种解决方案基于新的聚合函数,称为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,9}} (1 row) 我需要array2_agg_cutFirst函数(简单地切割第一个'{0,0}’子阵列),因为INITCOND ='{{}}’是不允许的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |