0

配列内の項目ごとに 1 つの行をテーブルに挿入する plpgsql 関数を作成する必要があります。

例: the_array=[1,2,3]

に挿入the_arrayした後の結果temp_table:

col
----
1
2
3

このリンクから次のコードを見つけました: http://postgresql.1045698.n5.nabble.com/insert-into-table-from-list-or-array-td3217891.html

INSERT INTO tmptab 
   SELECT v 
     FROM unnest(string_to_array('1,2,4,2,1',',')) g(v) 

それは魅力のように機能しますが、このコードがどのように機能するかわかりません。誰か説明してくれませんか?

4

2 に答える 2

1

PostgreSQL は Set Returning Function (2 番目の名前は表関数) をサポートしています。このクラスの関数は、スカラー値ではなくテーブルを返します。多くのユースケースがあります - 1つのユースケースは関数「unnest」です

関数の作成または置換 simple_srf(int)
SETOF int AS $$ を返します
始める
  FOR i IN 1..$1
  ループ
    RETURN NEXT i; -- 値を結果にプッシュ
  エンドループ;
  戻る; -- 実行を終了する
終わり;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;

postgres=# SELECT * FROM simple_srf(3);
 simple_srf
------------
          1
          2
          3
(3行)

関数 "string_to_array" は、セパレーターを配列に使用して文字列を解析します。

postgres=# select string_to_array('aaa*bbb*ccc','*');
 string_to_array
-----------------
 {aaa、bbb、ccc}
(1行)

Unnest は、配列をテーブルに変換する単純な関数です。plpgsql でのこの関数のソース コードは次のようになります。

-- 簡単にするために PostgreSQL 8.4 構文を使用します。
関数の作成または置換 unnest(anyarray)
SETOF anyelement AS $$ を返します
始める
  FOR i IN array_lower($1,1) .. array_upper($1,1)
  ループ
    次の $1[i] を返します。
  エンドループ;
  戻る;
終わり;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;

「Unnest」は多態的なセットの戻り関数です。PostgreSQL はより多くのビルトイン srf (表形式) 関数をサポートします - 例えば、generic_series や generate_subscripts

「unnest」関数の古い実装は次のとおりです。

関数の作成または置換 unnest(anyarray)
任意の要素を $$ として返します
SELECT $1[i] FROM generate_series(array_lower($1,1),array_upper($1,1)) g(i)
$$ LANGUAGE sql;

-- または generate_subscripts を使用
関数の作成または置換 unnest(anyarray)
任意の要素を $$ として返します
/*
 * g はテーブルのエイリアスです
 * i は列のエイリアスです
 */
SELECT $1[i] FROM generate_subscripts($1,1) g(i)
$$ LANGUAGE sql;
于 2013-07-29T07:32:34.183 に答える