在plpgsql中,我想从二维数组中一一获取数组内容。
DECLARE
m varchar[];
arr varchar[][] := array[['key1','val1'],['key2','val2']];
BEGIN
for m in select arr
LOOP
raise NOTICE '%',m;
END LOOP;
END;
但是上面的代码返回:
{{key1,val1},{key2,val2}}
排成一行。我希望能够循环并调用另一个带有如下参数的函数:
another_func(key1,val1)
有方便的
FOREACH
可以循环遍历数组的 slices。 手册:
目标变量必须是一个数组,并且它接收连续的 数组值的切片,其中每个切片的数量 尺寸由
指定。SLICE
DO
$do$
DECLARE
m text[];
arr text[] := '{{key1,val1},{key2,val2}}'; -- array literal
BEGIN
FOREACH m SLICE 1 IN ARRAY arr
LOOP
RAISE NOTICE 'another_func(%,%)', m[1], m[2];
END LOOP;
END
$do$;
db<>fiddle here - 使用函数打印结果,而不是
DO
LANGUAGE plpgsql
是 DO
语句的默认设置,因此我们可以省略声明。
对于 Postgres 类型系统,
text[]
和 text[][]
之间没有区别。参见:
DO
$do$
DECLARE
arr text[] := array[['key1','val1'],['key2','val2']]; -- array constructor
BEGIN
FOR i IN array_lower(arr, 1) .. array_upper(arr, 1)
LOOP
RAISE NOTICE 'another_func(%,%)', arr[i][1], arr[i][2];
END LOOP;
END
$do$;
*我的文章详细解释了如何使用 FOREACH 和 FOR 语句迭代一维和二维数组。
您可以使用
FOREACH
语句来迭代二维数组,如下所示:
DO $$
DECLARE
temp VARCHAR;
_2d_arr VARCHAR[] := ARRAY[
['a','b','c'],
['d','e','f']
];
BEGIN
FOREACH temp SLICE 0 IN ARRAY _2d_arr LOOP
RAISE INFO '%', temp;
END LOOP;
END
$$;
或者,您可以使用
FOR
语句来迭代二维数组,如下所示:
DO $$
DECLARE
_2d_arr VARCHAR[] := ARRAY[
['a','b','c'],
['d','e','f']
];
BEGIN
FOR num1 IN 1..2 LOOP
FOR num2 IN 1..3 LOOP
RAISE INFO '%', _2d_arr[num1][num2];
END LOOP;
END LOOP;
END
$$;
然后,您可以迭代二维数组,如下所示:
INFO: a
INFO: b
INFO: c
INFO: d
INFO: e
INFO: f
DO