【问题标题】:postgresql: select arraypostgresql:选择数组
【发布时间】:2011-10-02 08:47:43
【问题描述】:

我有一张看起来像这样的表格:

 id |   t   
----+-------
  1 | {1,2}
  2 | {5,2}
  3 | {6,2}
  4 | {1,7}
  5 | {1,8}
  6 | {1,9}

我正在寻找一个 SELECT 查询,它将返回 t 的数组,例如 {{1,2}, {5,2}, ... {1,9}}

如果 t 不是数组数据类型,它会很简单:

SELECT ARRAY (SELECT t from tbl_foo);

如果数据类型为int[],也可以这样做吗?

【问题讨论】:

  • 我添加了第二个,基于自定义聚合的解决方案,我认为它比纯函数更好。

标签: arrays postgresql select


【解决方案1】:

我不知道是否有更简单的方法(我希望如此),但这可行(PostgreSQL 没有数组数组,所以array_agg 方法在这里不起作用):

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, 2}'),
    ('{6, 2}'),
    ('{1, 7}'),
    ('{1, 8}'),
    ('{1, 9}');

SELECT func();
                 func                  
---------------------------------------
 {{1,2},{5,2},{6,2},{1,7},{1,8},{1,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,2},{5,2},{6,2},{1,7},{1,8},{1,9}}
(1 row)

我需要那个array2_agg_cutFirst 函数(只需先切割'{0, 0}' 子数组),因为INITCOND = '{{}}' 是不允许的。

【讨论】:

  • 感谢 Grzegorz Szpetkowski。你太棒了:)
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 2018-07-17
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多