微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐