数组 – postgresql:选择数组

我的桌子看起来像:

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 ='{{}}’是不允许的.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...