天天看點

PostgreSQL 10.1 手冊_部分 II. SQL 語言_第 9 章 函數和操作符_9.24. 集合傳回函數

9.24. 集合傳回函數

本節描述那些可能傳回多于一行的函數。目前這個類中被使用最廣泛的是級數生成函數, 如

表 9.58

表 9.59

所述。其他更特殊的集合傳回函數在本手冊的其他地方描述。 組合多集合傳回函數的方法可見

第 7.2.1.4 節

表 9.58. 級數生成函數

函數 參數類型 傳回類型 描述

generate_series(

start

stop

)

int

bigint

或者

numeric

setof int

setof bigint

setof numeric

 (與參數類型相同)
産生一系列值,從

start

stop

,步長為 1

generate_series(

start

stop

step

)

int

bigint

numeric

setof int

setof bigint

setof numeric

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

則傳回零行。對于

NULL

輸入也會傳回零行。

step

為零是一個錯誤。下面是一些例子:

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 generate_series(1.1, 4, 1.3);
 generate_series 
-----------------
             1.1
             2.4
             3.7
(3 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.59. 下标生成函數

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)

-- 平面化一個 2D 數組
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
SELECT * FROM unnest2(ARRAY[[1,2],[3,4]]);
 unnest2 
---------
       1
       2
       3
       4
(4 rows)      

FROM

子句中的一個函數後面跟着 

WITH ORDINALITY

時,一個

bigint

 字段被添加到為該函數的輸出的每一行從1開始、以1為增量的輸出中。 這在設定傳回函數,比如

unnest()

的情況下很有用。

-- 帶有WITH ORDINALITY的設定傳回函數
SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n);
       ls        | n
-----------------+----
 pg_serial       |  1
 pg_twophase     |  2
 postmaster.opts |  3
 pg_notify       |  4
 postgresql.conf |  5
 pg_tblspc       |  6
 logfile         |  7
 base            |  8
 postmaster.pid  |  9
 pg_ident.conf   | 10
 global          | 11
 pg_xact         | 12
 pg_snapshots    | 13
 pg_multixact    | 14
 PG_VERSION      | 15
 pg_wal          | 16
 pg_hba.conf     | 17
 pg_stat_tmp     | 18
 pg_subtrans     | 19
(19 rows)      

本文轉自PostgreSQL中文社群,原文連結: