×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

2.6.26. Функции, возвращающие множества

В данном разделе описываются функции, которые могут возвращать более одной строки. Наиболее широко используемыми функциями в этом классе являются функции генерации рядов, подробно описанные в Таблица 2.6.67 и Таблица 2.6.68. Другие, более специализированные функции, возвращающие множества, описаны в других разделах данного руководства. См. Раздел 2.4.2.1.4 для ознакомления со способами объединения нескольких функций, возвращающих множества.

Таблица 2.6.67. Функции генерации рядов

Функция

Описание

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 [, часовой пояс text ] ) → setof timestamp with time zone

Генерирует ряд значений от start в stop, с шагом из step. В форме, учитывающей часовой пояс, время суток и поправки на летнее время вычисляются в соответствии с часовым поясом, заданным в с часовой пояс аргументе, или текущим значением TimeZone значению параметра, если этот аргумент опущен.


Если значение 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 ( array anyarray, dim integer ) → setof integer

Генерирует последовательность, состоящую из допустимых индексов с dim-й размерности заданного массива.

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

Генерирует последовательность, состоящую из допустимых индексов с dim-й размерности заданного массива. Когда аргумент reverse имеет значение 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 строк)

-- развертывание двумерного массива:
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 строк)

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению