Перейти к основному содержимому

generate_series

Описание

Генерирует последовательность значений в интервале, заданном параметрами start и end, с необязательным параметром step.

generate_series() — это табличная функция. Табличная функция может возвращать набор строк для каждой входной строки. Набор строк может содержать ноль, одну или несколько строк. Каждая строка может содержать один или несколько столбцов.

Для использования generate_series() в Selena необходимо заключить её в ключевое слово TABLE, если входные параметры являются константами. Если входные параметры являются выражениями, такими как имена столбцов, ключевое слово TABLE не требуется (см. Пример 5).

Эта функция поддерживается начиная с версии 1.5.0.

Синтаксис

generate_series(start, end [,step])

Параметры

  • start: начальное значение последовательности, обязательный параметр. Поддерживаемые типы данных: INT, BIGINT и LARGEINT.
  • end: конечное значение последовательности, обязательный параметр. Поддерживаемые типы данных: INT, BIGINT и LARGEINT.
  • step: значение для увеличения или уменьшения, необязательный параметр. Поддерживаемые типы данных: INT, BIGINT и LARGEINT. Если не указан, шаг по умолчанию равен 1. step может быть как отрицательным, так и положительным, но не может быть равен нулю.

Все три параметра должны иметь одинаковый тип данных, например, generate_series(INT start, INT end [, INT step]).

Поддерживает именованные аргументы начиная с версии 1.5.0, где все параметры вводятся с именами, например name=>expr, как в generate_series(start=>3, end=>7, step=>2). Именованные аргументы могут изменять порядок аргументов и опционально устанавливать аргументы по умолчанию, но не могут смешиваться с позиционными аргументами.

Возвращаемое значение

Возвращает последовательность значений того же типа, что и входные параметры start и end.

  • Когда step положительный, возвращается ноль строк, если start больше end. И наоборот, когда step отрицательный, возвращается ноль строк, если start меньше end.
  • Возвращается ошибка, если step равен 0.
  • Эта функция обрабатывает null следующим образом: Если любой входной параметр является литералом null, выдается ошибка. Если любой входной параметр является выражением и результат выражения равен null, возвращается 0 строк (см. Пример 5).

Примеры

Пример 1: Генерация последовательности значений в диапазоне [2,5] в порядке возрастания с шагом по умолчанию 1.

MySQL > select * from TABLE(generate_series(2, 5));
+-----------------+
| generate_series |
+-----------------+
| 2 |
| 3 |
| 4 |
| 5 |
+-----------------+

Пример 2: Генерация последовательности значений в диапазоне [2,5] в порядке возрастания с указанным шагом 2.

MySQL > select * from TABLE(generate_series(2, 5, 2));
+-----------------+
| generate_series |
+-----------------+
| 2 |
| 4 |
+-----------------+

Пример 3: Генерация последовательности значений в диапазоне [5,2] в порядке убывания с указанным шагом -1.

MySQL > select * from TABLE(generate_series(5, 2, -1));
+-----------------+
| generate_series |
+-----------------+
| 5 |
| 4 |
| 3 |
| 2 |
+-----------------+

Пример 4: Возвращается ноль строк, когда step отрицательный и start меньше end.

MySQL > select * from TABLE(generate_series(2, 5, -1));
Empty set (0.01 sec)

Пример 5: Использование столбцов таблицы в качестве входных параметров generate_series(). В этом случае не нужно использовать TABLE() с generate_series().

CREATE TABLE t_numbers(start INT, end INT)
DUPLICATE KEY (start)
DISTRIBUTED BY HASH(start) BUCKETS 1;

INSERT INTO t_numbers VALUES
(1, 3),
(5, 2),
(NULL, 10),
(4, 7),
(9,6);

SELECT * FROM t_numbers;
+-------+------+
| start | end |
+-------+------+
| NULL | 10 |
| 1 | 3 |
| 4 | 7 |
| 5 | 2 |
| 9 | 6 |
+-------+------+

-- Генерация нескольких строк для строк (1,3) и (4,7) с шагом 1.
SELECT * FROM t_numbers, generate_series(t_numbers.start, t_numbers.end);
+-------+------+-----------------+
| start | end | generate_series |
+-------+------+-----------------+
| 1 | 3 | 1 |
| 1 | 3 | 2 |
| 1 | 3 | 3 |
| 4 | 7 | 4 |
| 4 | 7 | 5 |
| 4 | 7 | 6 |
| 4 | 7 | 7 |
+-------+------+-----------------+

-- Генерация нескольких строк для строк (5,2) и (9,6) с шагом -1.
SELECT * FROM t_numbers, generate_series(t_numbers.start, t_numbers.end, -1);
+-------+------+-----------------+
| start | end | generate_series |
+-------+------+-----------------+
| 5 | 2 | 5 |
| 5 | 2 | 4 |
| 5 | 2 | 3 |
| 5 | 2 | 2 |
| 9 | 6 | 9 |
| 9 | 6 | 8 |
| 9 | 6 | 7 |
| 9 | 6 | 6 |
+-------+------+-----------------+

Пример 6: Генерация последовательности значений в диапазоне [2,5] в порядке возрастания с указанным шагом 2, используя именованные аргументы.

MySQL > select * from TABLE(generate_series(start=>2, end=>5, step=>2));
+-----------------+
| generate_series |
+-----------------+
| 2 |
| 4 |
+-----------------+

ключевые слова

table function, generate series