Функции, возвращающие множества
В этом разделе описываются функции, которые могут возвращать более одной строки. Наиболее широко используемые функции в этом классе — это функции, генерирующие ряды значений, подробно описанные в Таблице 63 и Таблице 64. Другие, более специализированные функции, возвращающие множества, описаны в других разделах этого руководства. Способы объединения нескольких функций, возвращающих множества, см. в подразделе Табличные функции.
Таблица 63. Функции, генерирующие ряды значений
Функция |
||
---|---|---|
Описание |
||
generate_series ( начало integer, конец integer [, шаг integer ] ) → setof integer generate_series ( начало bigint, конец bigint [, шаг bigint ] ) → setof bigint generate_series ( начало numeric, конец numeric [, шаг numeric ] ) → setof numeric |
||
Генерирует ряд значений от начала до конца с заданным шагом. По умолчанию шаг равен 1. |
||
generate_series ( начало timestamp, конец timestamp, шаг interval ) → setof timestamp generate_series ( начало timestamp with time zone, конец timestamp with time zone, шаг interval ) → setof timestamp with time zone |
||
Генерирует ряд значений от начала до конца с заданным шагом. |
Если шаг положительный, а начало больше конца, возвращается ноль строк. И наоборот, когда шаг отрицательный, ноль строк возвращается, если начало меньше конца. Ноль строк также возвращается, если какой-либо аргумент равен 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 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)
Таблица 64. Функции, генерирующие индексы массивов
Функция |
||
---|---|---|
Описание |
||
generate_subscripts ( массив anyarray, размерность integer ) → setof integer |
||
Генерирует ряд значений, содержащий все допустимые индексы в заданной размерности данного массива. |
||
generate_subscripts ( массив anyarray, размерность integer, обратный_порядок boolean ) → setof integer |
||
Генерирует ряд значений, содержащий все допустимые индексы в заданной размерности данного массива. Когда параметр обратный_порядок равен true, возвращает ряд значений в порядке от большего к меньшему. |
generate_subscripts — это вспомогательная функция, которая генерирует набор допустимых индексов для указанной размерности данного массива. Для массивов, у которых нет запрошенной размерности, или если какой-либо аргумент равен 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)
-- разворачивание двумерного массива
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().
-- функция, возвращающая множество, с нумерацией
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
qhb.conf | 5
pg_tblspc | 6
logfile | 7
base | 8
qhbmaster.pid | 9
qhb_ident.conf | 10
global | 11
pg_xact | 12
pg_snapshots | 13
pg_multixact | 14
QHB_VERSION | 15
pg_wal | 16
qhb_hba.conf | 17
pg_stat_tmp | 18
pg_subtrans | 19
(19 rows)