無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

9.24. 集合を返す関数

本節では、場合により複数行を返す関数について説明します。最も広く用いられているこのクラスの関数は、 表9-49 、および 表9-50 にて詳細が触れられている、連続生成関数です。 他方、より特化された集合返還関数の記述がこのマニュアルのいたるところにあります。

表 9-49. Series Generating Functions

関数 引数型 戻り型 説明
generate_series( start , stop ) int または bigint setof int または setof bigint (引数の型と同一) start から stop まで、刻み1で連続する値を生成します。
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 よりも大きいと0行が返ります。反対に、 step が負の場合は、 start stop よりも小さいと0行が返ります。 step が0の時はエラーになります。また、 NULL が入力された場合も0行が返ります。以下にいくつか例を示します。

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-50. 添え字生成関数

関数 戻り値型 説明
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,300}
(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,300} |         1 |   100
 {100,200,300} |         2 |   200
 {100,200,300} |         3 |   300
(5 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)


powered by SEO.CUG.NET