9.25. Функции, возвращающие наборы значений#

9.25. Функции, возвращающие наборы значений

9.25. Функции, возвращающие наборы значений

Этот раздел описывает функции, которые могут возвращать более одной строки. Самые широко используемые функции в этом классе - это функции генерации серий, подробно описанные в Таблица 9.64 и Таблица 9.65. Другие, более специализированные функции, возвращающие наборы, описаны в другом месте в этом руководстве. См. Раздел 7.2.1.4 для способов объединения нескольких функций, возвращающих наборы.

Таблица 9.64. Функции генерации серий

Функция

Описание

generate_series ( start integer, stop integer [, step integer ] ) → setof integer

generate_series ( start bigint, stop bigint [, step bigint ] ) → setof bigint

generate_series ( start numeric, stop numeric [, step numeric ] ) → setof numeric

Генерирует серию значений от start до stop с шагом step. Значение step по умолчанию равно 1.

generate_series ( start timestamp, stop timestamp, step interval ) → setof timestamp

generate_series ( start timestamp with time zone, stop timestamp with time zone, step interval ) → 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)

-- this example relies on the date-plus-integer operator:
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.65. Функции генерации подписей

Функция

Описание

generate_subscripts ( array anyarray, dim integer ) → setof integer

Создает серию, содержащую допустимые индексы подсценариев dim-го измерения данного массива.

generate_subscripts ( array anyarray, dim integer, reverse boolean ) → setof integer

Создает серию, содержащую допустимые индексы подмассивов dim-го измерения данного массива. Если reverse равно true, возвращает серию в обратном порядке.


generate_subscripts - это удобная функция, которая генерирует набор допустимых индексов для указанного измерения заданного массива. Для массивов, которые не имеют запрошенного измерения, возвращаются нулевые строки, или если любой входной параметр равен NULL. Приведены некоторые примеры:

-- basic usage:
SELECT generate_subscripts('{NULL,1,NULL,2}'::int[], 1) AS s;
 s
---
 1
 2
 3
 4
(4 rows)

-- presenting an array, the subscript and the subscripted
-- value requires a subquery:
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)

-- unnest a 2D array:
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().

-- set returning function 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)