Вы можете делать такие вещи в прямом SQL, если у вас есть дополнительная таблица, содержащая все нужные вам целые числа.
Предположим, ваш диапазон StartRange
и EndRange
составляет от одного до десяти, и у вас есть таблица, подобная этой:
sqlite> select i from ints;
i
1
.
.
.
10
Эта таблица просто содержит все возможные целые числа, которые вам нужны (то есть, от одного до десяти).
Тогда, если у вас также есть это:
sqlite> create table t (startrange int not null, endrange int not null);
sqlite> insert into t values(1, 3);
sqlite> create table target (i int not null);
Вы можете сделать свои ВСТАВКИ в target
с помощью соединения:
insert into target (i)
select ints.i
from ints join t on (ints.i >= t.startrange and ints.i <= t.endrange)
Результат таков:
sqlite> select * from target;
i
1
2
3
Конечно, ваш реальный t
будет иметь больше строк, поэтому вы хотите, чтобы предложение WHERE ограничивало, какую строку из t
вы просматриваете.
Подобные вещи часто выполняются с датами (посмотрите «таблицы календаря»).
Таким образом, если ваши диапазоны малы (для некоторого определения small ), то сгенерируйте таблицу ints
один раз, добавьте к ней индекс и используйте описанную выше технику для выполнения всех INSERT прямо внутри база данных. Другие базы данных имеют свои собственные способы (такие как generate_series
) в PostgreSQL, чтобы делать подобные вещи без явной таблицы ints
, но SQLite (намеренно) ограничен.
SQL обычно основан на множествах, поэтому циклы не являются естественными. Естественно строить соответствующие наборы, описывая то, что вам нужно. OTOH, иногда неестественные действия необходимы и разумны.
Я не знаю, имеет ли это смысл для вашего приложения, я просто подумал, что продемонстрирую, как это можно сделать. Если этот подход не имеет смысла в вашем случае, вы можете сгенерировать кучу операторов INSERT вне базы данных.