使用 Postgres 在数组上映射函数

Ran*_*ize 6 postgresql

Postgres 中是否有任何方法可以将函数应用于数组(或任何类型的集合)的结果?

例如,如果我有一个create function add1...将数字加一的函数,有什么办法可以做到:

select map add1 array[1,5,8...];
Run Code Online (Sandbox Code Playgroud)

回来

array [2,6,9...]
Run Code Online (Sandbox Code Playgroud)

?

我不确定它是否对 a 有任何意义,select因为它可以直接将函数映射到单个结果上:

select add1(x) from X;
Run Code Online (Sandbox Code Playgroud)

另外,这里有懒惰的概念吗?所有功能都将“严格”应用?

bma*_*bma 2

如果您只是想增加输入数组的每个元素,这个简单的函数是实现此目的的一种方法。

CREATE OR REPLACE FUNCTION add1 (int[]) RETURNS int[] AS
$func$
DECLARE
    e       int;
    new_arr int[] := '{}';
BEGIN
    FOREACH e IN ARRAY $1 LOOP
        e := e + 1;
        new_arr := new_arr || e;
    END LOOP;
    RETURN new_arr;
END;
$func$ LANGUAGE plpgsql STABLE;

SELECT add1(array[1,5,8,15]::int[]);
    add1
------------
 {2,6,9,16}
Run Code Online (Sandbox Code Playgroud)

或者从您的表中查询

select id, array_col, add1(array_col) from yourtable;
 id |      arr      |     add1
----+---------------+---------------
  1 | {1,3,6,9}     | {2,4,7,10}
  2 | {10,20,30,40} | {11,21,31,41}
Run Code Online (Sandbox Code Playgroud)

该函数的纯 SQL 版本:

CREATE OR REPLACE FUNCTION add1(int[]) RETURNS int[] AS
$func$
    SELECT array_agg(vals)
    FROM (select unnest($1) + 1 as vals) AS x;
$func$ LANGUAGE sql STABLE;
Run Code Online (Sandbox Code Playgroud)