2

テーブルの内容を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クエリのみを使用することで可能ですか?)

ご協力いただきありがとうございます。:-)

編集:スキーマ

4

1 に答える 1

1

これはおそらく、この関連する質問で概説されている集計関数を使用してかなり簡単に解決できます:
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;

アップデート

2D配列にするには、配列レイヤーを追加する必要があります。
すべての1D配列は同じ長さを共有する必要があることに注意してください。そうしないと、クエリがエラーになります。

->sqlfiddleで両方を示します。

于 2013-02-06T19:10:59.047 に答える