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

标签 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

最佳答案

这可能可以很容易地用这个相关问题下概述的聚合函数来解决:
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/

相关文章:

spring - 获取一系列 SQL 警告 : "relation <table> does not exist, skipping"

c++ - 错误地访问二维数组中的值

javascript - 如何合并多维数组?

sql - 通过来自不同未链接表的不同字段的连续循环

postgresql - AFTER INSERT PostgreSQL 触发器的意外行为

sql - 为什么我的 SQL 查询不使用索引?

postgresql - 大表上的 Postgres 时间更新

database - 存储时间序列数据的简单方法

postgresql - 在 postgreSQL 中创建表

ruby - 如何检查一个多维 Ruby 数组中的元素是否存在于另一个数组中?