RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.
Табличная функция generate_series

1. Обзор

Табличная функция generate_series(START,STOP,STEP) это загружаемое расширение, включенное в исходное дерево SQLite и собранное в the оболочке командной строки. У таблицы generate_series() есть один видимый столбец результата, названный "value", содержащий целочисленные значения, и много строк, определенных параметрами 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 будет опущен или будет иметь самоссылочное или в других отношениях невычислимое значение. Более старые версии использовали по умолчанию 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));