跳转至

集合返回函数

集合返回函数

本节描述那些可能返回多于一行的函数。目前这个类中被使用最广泛的是级数生成函数,包括级数生成函数下标生成函数

generate_series()

语法
sql generate_series(start, stop) generate_series(start, stop, step) generate_series(start, stop, step interval)
参数类型
int/bigint或者numerictimestamp/timestamp with time zone
返回类型
setof 参数类型
描述
参数为2个时,产生一系列值,从startstop,步长为 1 ;参数为3个,且为数值时,产生一系列值,从startstop,步长为step ; 参数为3个,且为时间类型时, 产生一系列值,从startstop,步长为step

step为正时,如果start大于stop则返回零行。相反,当step为负时,如果start小于stop则返回零行。对于NULL输入也会返回零行。step为零是一个错误。

示例

``` sql seaboxsql=# SELECT * FROM generate_series(2,4); generate_series


       2
       3
       4

(3 rows)

seaboxsql=# SELECT * FROM generate_series(5,1,-2); generate_series


           5
           3
           1

(3 rows)

seaboxsql=# SELECT * FROM generate_series(4,3); generate_series


(0 rows)

seaboxsql=# SELECT generate_series(1.1, 4, 1.3); generate_series


         1.1
         2.4
         3.7

(3 rows)

seaboxsql=# – 这个例子依赖于日期+整数操作符 seaboxsql=# SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a); dates


2022-02-26 2022-03-05 2022-03-12 (3 rows)

seaboxsql=# SELECT * FROM generate_series('2008-03-01 00:00'::timestamp, seaboxsql(# '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) ```

generate_subscripts()

语法
sql generate_subscripts(array anyarray, dim int) generate_subscripts(array anyarray, dim int, reverse boolean)
参数类型
数组和int
返回类型
setof int
描述
参数为2个时,生成一个级数组成给定数组的下标; 参数为3个,生成一个级数组成给定数组的下标。当reverse为真,级数以逆序返回。

generate_subscripts是一个快捷函数,它为给定数组的指定维度生成一组合法的下标。对于不具有请求维度的数组返回零行,对于 NULL 数组也返回零行(但是会对 NULL 数组元素返回合法的下标)。

示例

``` sql seaboxsql=# – 基本使用 seaboxsql=# SELECT generate_subscripts('{NULL,1,NULL,2}'::int[], 1) AS s; s


1 2 3 4 (4 rows)

seaboxsql=# create table arrays(a int[]); CREATE TABLE seaboxsql=# insert into arrays values(array[-1,-2]); INSERT 0 1 seaboxsql=# insert into arrays values(array[100,200,300]); INSERT 0 1 seaboxsql=# – 表示一个数组,下标和被下标的值需要一个子查询 seaboxsql=# SELECT * FROM arrays; a


{-1,-2} {100,200,300} (2 rows)

seaboxsql=# SELECT a AS array, s AS subscript, a[s] AS value seaboxsql-# 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)

seaboxsql=# CREATE OR REPLACE FUNCTION unnest2(anyarray) seaboxsql-# RETURNS SETOF anyelement AS $$ seaboxsql# select 1[i][j] seaboxsql# from generate_subscripts(# from generate_subscripts(# from generate_subscripts(# from generate_subscripts(1,1) g1(i), seaboxsql# generate_subscripts(1,2) g2(j); seaboxsql$# $$ LANGUAGE sql IMMUTABLE; CREATE FUNCTION seaboxsql=# SELECT * FROM unnest2(ARRAY[[1,2],[3,4]]); unnest2


   1
   2
   3
   4

(4 rows) ```

FROM子句中的一个函数后面有WITH ORDINALITY时,输出中会追加一个bigint列,它的值从1开始并且该函数输出的每一行加1。这在unnest()之类的集合返回函数中最有用。

sql seaboxsql=# -- set returning function WITH ORDINALITY seaboxsql=# SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n); ls | n ---------------------+---- sd_wal | 1 global | 2 sd_commit_ts | 3 sd_dynshmem | 4 sd_notify | 5 sd_serial | 6 sd_snapshots | 7 sd_subtrans | 8 sd_twophase | 9 sd_multixact | 10 base | 11 sd_replslot | 12 sd_tblspc | 13 sd_stat | 14 sd_stat_tmp | 15 sd_xact | 16 sd_csnlog | 17 sd_logical | 18 sd_distributedlog | 19 tmp | 20 sd_log | 21 SD_VERSION | 22 internal.auto.conf | 23 seaboxsql.auto.conf | 24 sd_hba.conf | 25 sd_ident.conf | 26 seabox_license | 27 seaboxsql.conf | 28 seaboxmaster.opts | 29 encrypted_password | 30 encrypted_mek | 31 pgddltest.tmp | 32 seaboxmaster.pid | 33 (33 rows)