В данном разделе описываются функции, которые могут возвращать более одной строки. Наиболее широко используемыми функциями в этом классе являются функции генерации рядов, подробно описанные в Таблица 2.6.67 и Таблица 2.6.68. Другие, более специализированные функции, возвращающие множества, описаны в других разделах данного руководства. См. Раздел 2.4.2.1.4 для ознакомления со способами объединения нескольких функций, возвращающих множества.
Таблица 2.6.67. Функции генерации рядов
Функция Описание |
|---|
Генерирует ряд значений от |
Генерирует ряд значений от |
Если значение 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 строки)
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 строк)
-- в данном примере предполагается, что для параметра TimeZone установлено значение UTC; обратите внимание на переход на летнее время (DST):
SELECT * FROM generate_series('2001-10-22 00:00 -04:00'::timestamptz,
'2001-11-01 00:00 -05:00'::timestamptz,
'1 day'::interval, 'America/New_York');
generate_series
------------------------
2001-10-22 04:00:00+00
2001-10-23 04:00:00+00
2001-10-24 04:00:00+00
2001-10-25 04:00:00+00
2001-10-26 04:00:00+00
2001-10-27 04:00:00+00
2001-10-28 04:00:00+00
2001-10-29 05:00:00+00
2001-10-30 05:00:00+00
2001-10-31 05:00:00+00
2001-11-01 05:00:00+00
(11 строк)
Таблица 2.6.68. Функции генерации индексов
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 строк)
-- развертывание двумерного массива:
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 строки)
Когда к функции в предложении FROM к предложению добавляется суффикс WITH ORDINALITY, в bigint состав выходных столбцов функции включается дополнительный столбец, значения в котором начинаются с 1 и увеличиваются на 1 для каждой строки результата функции. Данная возможность наиболее полезна для функций, возвращающих наборы (set returning functions), таких как 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 строк)