加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读