集合返回函数
集合返回函数¶
本节描述那些可能返回多于一行的函数。目前这个类中被使用最广泛的是级数生成函数,包括级数生成函数
和下标生成函数
。
generate_series()
¶
- 语法
sql generate_series(start, stop) generate_series(start, stop, step) generate_series(start, stop, step interval)
- 参数类型
int
/bigint
或者numeric
或timestamp
/timestamp with time zone
- 返回类型
- setof 参数类型
- 描述
- 参数为2个时,产生一系列值,从
start
到stop
,步长为 1 ;参数为3个,且为数值时,产生一系列值,从start
到stop
,步长为step
; 参数为3个,且为时间类型时, 产生一系列值,从start
到stop
,步长为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)