如何在 PostgreSQL 中循环二维数组?

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

我正在尝试循环遍历二维数组,从每个

row
获取第一个和第二个值来更新表格

CREATE OR REPLACE FUNCTION fc_update_arrangement(input_arrangementid int, input_NAME text, input_price money, input_expirationdate date, products int[][])
RETURNS void AS
$BODY$
BEGIN
  UPDATE arrangement SET "NAME" = $2, price = $3, expirationdate = $4 WHERE arrangementid = $1;
  -- loop through array getting the first and second value
  -- UPDATE productinarrangement SET amount = arrayinputnumber2 WHERE productid = arrayinputnumber1 AND arrangementid = $1
END;
$BODY$ LANGUAGE plpgsql STRICT;

在帮助下,我正确调用了函数,不再返回错误。我不明白如何循环遍历数组以获得其中的值?我已经注释掉了这些行,但我不知道该怎么办。我在这一行中调用该函数:

SELECT fc_update_arrangement(1::int,'tom'::text,15::money,now()::date,array[array[1,2],array[3,4]]);
sql arrays database postgresql multidimensional-array
2个回答
3
投票

文档中有一个示例:

CREATE FUNCTION scan_rows(int[]) RETURNS void AS $$
DECLARE
  x int[];
BEGIN
  FOREACH x SLICE 1 IN ARRAY $1
  LOOP
    RAISE NOTICE 'row = %', x;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT scan_rows(ARRAY[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]);

NOTICE:  row = {1,2,3}
NOTICE:  row = {4,5,6}
NOTICE:  row = {7,8,9}
NOTICE:  row = {10,11,12}

尝试口头描述:如果类型为

whatever[]
的数组并且使用
SLICE 1
循环,则数组将被切成每个元素一个元素的切片。然后,循环变量将包含相同类型
whatever[]
的数组,每个数组包含原始数组的一个元素。如果您选择
SLICE 2
,则循环变量将包含大小为 2 的数组。


0
投票

您可以从 2D(二维)数组中获取每行的第 1 个和第 2 个元素,如下所示:

CREATE FUNCTION my_func(_2D_arr INT[]) RETURNS VOID
AS $$
DECLARE
  temp INT[];
BEGIN
  FOREACH temp SLICE 1 IN ARRAY _2d_arr LOOP
    RAISE INFO '%', array_to_string(temp[1:2], ' ');
  END LOOP;
END
$$ LANGUAGE plpgsql;

*备注:

然后,使用 2D 数组调用

my_func()
即可获取每行的第一个和第二个元素,如下所示:

postgres=# SELECT my_func(ARRAY[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]);
INFO:  1 2
INFO:  4 5
INFO:  7 8
INFO:  10 11
 my_func
---------

(1 row)

这是带有 DO 语句的示例

DO $$
DECLARE
  temp VARCHAR[];
  _2d_arr VARCHAR[] := ARRAY[
    [1,2,3],
    [4,5,6],
    [7,8,9],
    [10,11,12]
  ];
BEGIN
  FOREACH temp SLICE 1 IN ARRAY _2d_arr LOOP
    RAISE INFO '%', array_to_string(temp[1:2], ' ');
  END LOOP;
END
$$;
© www.soinside.com 2019 - 2024. All rights reserved.