在 PL/pgSQL 中迭代整数[]

问题描述 投票:0回答:2

我正在尝试在 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
作为参数传递给函数。我收到此错误:

错误:“$1”处或附近有语法错误 第 1 行:1 美元

如何正确循环数组?

arrays postgresql loops plpgsql postgresql-8.4
2个回答
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<>小提琴这里

也适用于多维数组: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()
的基于集合的解决方案通常比循环大集合更快。基本示例:


0
投票

*我的文章详细解释了如何使用 FOREACHFOR 语句迭代一维和二维数组。

您可以使用

FOREACH
语句来迭代
INT[]
的一维数组,如下所示:

DO $$
DECLARE
  temp INT;
  _1d_arr INT[] := ARRAY[1,2,3];
BEGIN
  FOREACH temp SLICE 0 IN ARRAY _1d_arr LOOP
    RAISE INFO '%', temp;
  END LOOP;
END
$$;

或者,您可以使用

FOR
语句来迭代
INT[]
的一维数组,如下所示:

DO $$
DECLARE
  _1d_arr INT[] := ARRAY[1,2,3];
BEGIN
  FOR num IN 1..3 LOOP
    RAISE INFO '%', _1d_arr[num];
  END LOOP;
END
$$;

然后,您可以迭代

INT[]
的一维数组,如下所示:

INFO:  1
INFO:  2
INFO:  3
DO
© www.soinside.com 2019 - 2024. All rights reserved.