我正在尝试将表的内容具体化为 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
最佳答案
这可能可以很容易地用这个相关问题下概述的聚合函数来解决:
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以证明两者。
关于postgresql - 多维数组的赋值在 PL/PGSQL 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14732753/