PL/PGSQL中多维数组的值分配失败



我正试图在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查询是可能的?)。

谢谢你的帮助。:-)

编辑:架构

这可能可以通过以下相关问题中概述的聚合函数很容易地解决:
将数据选择到Postgres阵列

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演示两者。

相关内容

  • 没有找到相关文章

最新更新