在plpgsql中循环数组维度

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

在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)
arrays postgresql multidimensional-array for-loop plpgsql
2个回答
148
投票

自 PostgreSQL 9.1 起

有方便的

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[][]
之间没有区别。参见:

Postgres 9.0 或更低版本

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$;

0
投票

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

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.