2

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

(仅适用于那些想知道“邻居”是什么的人:表 wnode 和楔形定义了一个带有节点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 查询是可能的?)。

谢谢你的帮助。:-)

编辑:架构

4

1 回答 1

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;

更新

您必须添加一个数组层以使其成为二维数组。
请注意,所有一维数组必须共享相同的长度,否则查询将出错。

-> sqlfiddle来演示两者。

于 2013-02-06T19:10:59.047 回答