多维数组的值赋值在PL / PGSQL中失败

时间:2013-02-06 15:33:37

标签: postgresql multidimensional-array plpgsql

我正在尝试将表的内容实现为PL / PGSQL中的多维数组。

(仅针对那些想知道“邻居”是什么的人:表wnode和wedge定义了一个包含节点wnode和边wedge的图。现在我想存储一个节点的邻居v在neighbors[v])中包含的数组中。

这是我到目前为止所做的:

DECLARE
    neighbors INTEGER[][];
    v INTEGER;
BEGIN
    FOR v IN SELECT n_id FROM wnode LOOP
        SELECT ARRAY ( SELECT n2_id FROM wedge WHERE n1_id=v) INTO neighbors[v];
    END LOOP;

    RETURN neighbors;

由于语法错误,上述代码失败:

ROW 7: ...( SELECT n2_id FROM wedge WHERE n1_id=v) INTO neighbors[v];
                                                                 ^

我接下来尝试的是引入支持变量tmp

DECLARE
    neighbors INTEGER[][];
    v INTEGER;
    tmp INTEGER[];
BEGIN
    FOR v IN SELECT n_id FROM wnode LOOP
        SELECT ARRAY ( SELECT n2_id FROM wedge WHERE n1_id=v) INTO tmp;
        neighbors[v] := tmp;
    END LOOP;

    RETURN neighbors;
END

我收到了这个运行时错误:

ERROR:  invalid input syntax for integer: »{140,153,290,360,393}«

我也尝试使用SELECT array_append(neighbors, tmp) INTO neighbors;但没有成功。

我现在没有想法。我接下来要尝试的是迭代tmp并分配每个值neighbors[v][i] := tmp[i]; ...不是很优雅。

我想知道如何以更优雅的方式填充多维数组? (也许只能使用一个SQL查询?)。

感谢您的帮助。 :-)

编辑:Schema

1 个答案:

答案 0 :(得分:1)

使用此相关问题下概述的聚合函数可以很容易地解决这个问题:
Selecting data into a Postgres array

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
   ,STYPE     = anyarray
   ,INITCOND  = '{}'
);

猜猜(因为缺少表定义):

SELECT INTO neighbors 
       array_agg_mult(ARRAY[e_arr]) AS mult_arr
FROM  (
   SELECT array_agg(n2_id) AS e_arr
   FROM   wedge
   GROUP  BY n1_id
   ORDER  BY n1_id
   ) e;

更新

你必须添加一个数组层才能使它成为一个二维数组 请注意,所有1D阵列必须共享相同的长度,否则查询将会出错。

->sqlfiddle展示两者。