我正在尝试在 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 美元
如何正确循环数组?
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()
的基于集合的解决方案通常比循环大集合更快。基本示例:
*我的文章详细解释了如何使用 FOREACH 和 FOR 语句迭代一维和二维数组。
您可以使用
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