在 PL/pgSQL 中迭代整数数组

69

我正在尝试在一个 plpgsql 函数中遍历一个整数数组(integer[]),类似这样:

declare
    a integer[] = array[1,2,3];
    i bigint;
begin
    for i in a
loop 
    raise notice "% ",i;
end loop;
return true;
end

在我的实际使用中,整数数组a作为参数传递给函数。我收到了以下错误:
ERROR:  syntax error at or near "$1"
LINE 1:   $1

如何正确循环遍历数组?

1个回答

129

Postgres 9.1添加了FOREACH用于循环遍历数组:

DO
$do$
DECLARE
   _arr  int[] := '{1,2,3,4}';
   _elem int;                      -- matching element type
BEGIN
   FOREACH _elem IN ARRAY _arr
   LOOP 
      RAISE NOTICE '%', _elem;
   END LOOP;
END
$do$;

在db<>fiddle这里

适用于多维数组:Postgres会将数组展平并迭代所有元素。要循环遍历切片,请参见下面的链接。

对于旧版本:

   FOR i IN 1 .. array_upper(_arr, 1)  -- "i" is the index
   LOOP
      RAISE NOTICE '%', _arr[i];       -- single quotes
   END LOOP;

对于多维数组和循环遍历数组切片,请参见:

然而,基于集合的解决方案使用generate_series()unnest()通常比遍历大型数据集更快。基本示例:


现在我正在将数组作为 f(array[1,2,3,4]) 传递给函数,有更好的方法来传递一个数组到函数吗? - Dipro Sen
7
f('{1,2,3,4}'::int[])另一种方式。更好吗? - 由你决定! - Erwin Brandstetter
"i"是值,而不是索引。 - Daniel Bentes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接