在postgres中访问和修改多维数组

时间:2017-06-13 20:07:48

标签: sql arrays postgresql multidimensional-array plpgsql

我无法弄清楚如何在postgres中更改多维数组。假设有以下代码:

do
$$
declare 
    a double precision[][];
    x integer;
    y integer;

begin
    for x in 1..3 loop
        for y in 1..3 loop
            a[x y]:= x * y;
            raise notice 'x: %, y: %, value: %, should be: %',x, y,   a[x:y], x*y;
        end loop;
    end loop;
end 
$$
language plpgsql;

结果如下:

x: 1, y: 1, value: {1}, should be: 1
x: 1, y: 2, value: {2}, should be: 2
x: 1, y: 3, value: {3}, should be: 3
x: 2, y: 1, value: {}, should be: 2
x: 2, y: 2, value: {4}, should be: 4
x: 2, y: 3, value: {6}, should be: 6
x: 3, y: 1, value: {}, should be: 3
x: 3, y: 2, value: {}, should be: 6
x: 3, y: 3, value: {9}, should be: 9

如您所见,存在一些问题。例如,x=2y=1的组合会产生{}

通常我认为我可以通过

更改数组
a[x][y]:= value;

但这会产生错误。

1 个答案:

答案 0 :(得分:0)

您的示例运行一维数组 - 您可以使用array_ndims(a)进行检查。或只是raise info '%',a;

而是尝试a[x][y]:= value;方法明确定义维度以避免错误,例如:

do
$$
declare
    a double precision[][];
    x integer;
    y integer;

begin
    a := array[[NULL,NULL,NULL],[NULL,NULL,NULL],[NULL,NULL,NULL]];
    for x in 1..3 loop
        for y in 1..3 loop
            a[x][y]:= x * y;
            raise notice 'x: %, y: %, value: %, should be: %',x, y,   a[x][y], x*y;
        end loop;
    end loop;
    raise info '%',a;
end
$$
language plpgsql;
NOTICE:  x: 1, y: 1, value: 1, should be: 1
NOTICE:  x: 1, y: 2, value: 2, should be: 2
NOTICE:  x: 1, y: 3, value: 3, should be: 3
NOTICE:  x: 2, y: 1, value: 2, should be: 2
NOTICE:  x: 2, y: 2, value: 4, should be: 4
NOTICE:  x: 2, y: 3, value: 6, should be: 6
NOTICE:  x: 3, y: 1, value: 3, should be: 3
NOTICE:  x: 3, y: 2, value: 6, should be: 6
NOTICE:  x: 3, y: 3, value: 9, should be: 9
INFO:  {{1,2,3},{2,4,6},{3,6,9}}
DO

还要介意 - 我将冒号切片更改为raise

中的精确索引