Функция с табличным значением generate_series
Содержание
1. Обзор
Функция с табличным значением generate_series(START,STOP,STEP) — это загружаемый модуль, включенный в исходный код SQLite, и компилируемый в командную оболочку. Таблица generate_series() имеет один видимый столбец результатов под названием «значение», содержащий целочисленные значения, и количество строк, определяемое параметрами START, STOP и STEP. Первая строка таблицы имеет значение START. Последующие строки увеличиваются на STEP до значения, не превышающего STOP.
Таблица generate_series() имеет дополнительные скрытые столбцы под названием «start», «stop» и «step», значения которых соответствуют эффективным значениям START, STOP и STEP, предоставленным или заданным по умолчанию. Она также имеет rowid, доступный под своими обычными именами.
Пропущенные параметры принимают значения по умолчанию. STEP по умолчанию равен 1. STOP по умолчанию равен 4294967295. Параметр START обязателен начиная с версии 3.37.0 (2021-11-27) и последующих версий, и при его отсутствии или наличии самоссылочного или иного невычислимого значения будет выведено сообщение об ошибке. В более старых версиях параметр START по умолчанию равнялся 0. Предыдущее поведение можно получить из последнего кода, скомпилировав его с флагом -DZERO_ARGUMENT_GENERATE_SERIES.
1.1. Эквивалентное рекурсивное общее выражение с таблицей
Для значений шага больше нуля таблицу generate_series можно смоделировать с помощью рекурсивного общего выражения с таблицей. Если три параметра — $start, $end и $step, то эквивалентное общее выражение с таблицей будет:
WITH RECURSIVE generate_series(value) AS ( SELECT $start UNION ALL SELECT value+$step FROM generate_series WHERE value+$step<=$end ) ...
Общее выражение с таблицей работает без необходимости загрузки расширения. С другой стороны, расширение проще программировать и быстрее.
2. Примеры использования
Сгенерировать все кратные 5, не превышающие 100:
SELECT value FROM generate_series(5,100,5);
Сгенерировать 20 случайных целых значений:
SELECT random() FROM generate_series(1,20);
Найти имя каждого клиента, номер счета которого является чётным кратным 100 между 10000 и 20000.
SELECT customer.name
FROM customer, generate_series(10000,20000,100)
WHERE customer.id=value;
/* or */
SELECT name FROM customer
WHERE id IN (SELECT value
FROM generate_series(10000,20000,200));
Эта страница была последней раз отредактирована 01.05.2023 21:49:55 UTC
SQLite is in the Public Domain.
https://sqlite.org/series.html