集合を返す関数

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 第 9章関数と演算子 | 早送り | 次のページ

# 9.22. 集合を返す関数

本節では、場合により複数行を返す関数について説明します。現在、このクラスの関数のみが、表9-45、および表9-46で説明する、連続生成関数です。

表 9-45. Series Generating Functions

関数 | 引数型 | 戻り型 | 説明
--- | --- | --- | ---
``generate_series`(`start`, `stop`)` | `int`または`bigint` | `setof int`または`setof bigint`（引数の型と同一） | `start`から`stop`まで、刻み１で連続する値を生成します。
``generate_series`(`start`, `stop`, `step`)` | `int`または`bigint` | `setof int`または`setof bigint`（引数の型と同一） | `start`から`stop`まで、刻み`step`で連続する値を生成します。
``generate_series`(`start`, `stop`, `step` `interval`)` | `timestamp` または `timestamp with time zone` | `setof timestamp` または `setof timestamp with time zone`（引数型と同じ） | `start`から`stop`まで、刻み`step`で連続する値を生成します。

`step`が正の場合、`start`が`stop`よりも大きいと０行が返ります。反対に、`step`が負の場合は、`start`が`stop`よりも小さいと０行が返ります。`step`が０の時はエラーになります。また、`NULL`が入力された場合も０行が返ります。以下にいくつか例を示します。

    SELECT * FROM generate_series(2,4);
     generate_series
    -----------------
                   2
                   3
                   4
    (3 rows)

    SELECT * FROM generate_series(5,1,-2);
     generate_series
    -----------------
                   5
                   3
                   1
    (3 rows)

    SELECT * FROM generate_series(4,3);
     generate_series
    -----------------
    (0 rows)

    -- この例は日付に整数を足し込む演算子に依存します。
    SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a);
       dates
    ------------
     2004-02-05
     2004-02-12
     2004-02-19
    (3 rows)

    SELECT * FROM generate_series('2008-03-01 00:00'::timestamp,
                                  '2008-03-04 12:00', '10 hours');
       generate_series
    ---------------------
     2008-03-01 00:00:00
     2008-03-01 10:00:00
     2008-03-01 20:00:00
     2008-03-02 06:00:00
     2008-03-02 16:00:00
     2008-03-03 02:00:00
     2008-03-03 12:00:00
     2008-03-03 22:00:00
     2008-03-04 08:00:00
    (9 rows)

表 9-46. 添え字生成関数

関数 | 戻り値型 | 説明
--- | --- | ---
``generate_subscripts`(`array anyarray`, `dim int`)` | `setof int` | 指定した配列の添え字を構成するシリーズを生成します。
``generate_subscripts`(`array anyarray`, `dim int`, `reverse boolean`)` | `setof int` | 指定した配列の添え字を構成する連番を生成します。 `reverse`が真の場合、連番は逆順に返されます。

`generate_subscripts`は、指定した配列の指定した次数で有効な添え字からなる集合を生成するために便利な関数です。 要求された次数を持たない配列またはNULL配列では行は返されません。 （しかしこれはNULL配列要素では有効な添え字です。） いくつかの例を以下に示します。

    -- 基本的用法
    select generate_subscripts('{NULL,1,NULL,2}'::int[], 1) as s;
     s
    ---
     1
     2
     3
     4
    (4 rows)
    -- ある配列では、添え字とその添え字が示す値は
    -- 副問い合わせが必要です。
    select * from arrays;
             a
    --------------------
     {-1,-2}
     {100,200}
    (2 rows)

    select a as array, s as subscript, a[s] as value
    from (select generate_subscripts(a, 1) as s, a from arrays) foo;
       array   | subscript | value
    -----------+-----------+-------
     {-1,-2}   |         1 |    -1
     {-1,-2}   |         2 |    -2
     {100,200} |         1 |   100
     {100,200} |         2 |   200
    (4 rows)

    -- 2次元配列の入れ子を解きます。
    create or replace function unnest2(anyarray)
    returns setof anyelement as $$
    select $1[i][j]
       from generate_subscripts($1,1) g1(i),
            generate_subscripts($1,2) g2(j);
    $$ language sql immutable;
    CREATE FUNCTION
    postgres=# select * from unnest2(array[[1,2],[3,4]]);
     unnest2
    ---------
           1
           2
           3
           4
    (4 rows)

前のページ | ホーム | 次のページ
行と配列の比較 | 上に戻る | システム情報関数