gpt4 book ai didi

arrays - postgresql:选择数组

转载 作者:行者123 更新时间:2023-11-29 11:34:42 25 4
gpt4 key购买 nike

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

 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[] 也可以这样做吗?

最佳答案

我不知道是否有更简单的方法(我希望如此),但这可行(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 = '{{}}' 是不允许的。

关于arrays - postgresql:选择数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6643305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com