SQL: выберите список чисел из "ничего"
Что такое быстрый/читаемый способ SELECT отношения из "ничего", содержащего список чисел. Я хочу определить, какие числа устанавливают начальное и конечное значение. Я использую Postgres SQL и SQLite, и вас будут интересовать решения generic, которые будут работать на обеих платформах.
Требуемое отношение вывода:
# x
0
1
2
3
4
Я знаю, что я могу ВЫБРАТЬ одну строку из "ничего": SELECT 0,1,2,3,4
Но это выбирает значения как столбцы вместо строк и требует указать все значения в запросе вместо использования моих начальных и конечных значений: 0
и 4
.
В Postgres у вас есть специальная функция generate_series
для этого случая:
SELECT * FROM generate_series(0,4) x;
Это работает хорошо, но нестандартно. Я также могу представить некоторые сложные решения, используя временные таблицы, но я хотел бы иметь что-то общее и простое:
SELECT * FROM [0..4]
Возможно, используя оператор SEQUENCE
или какую-нибудь магическую комбинацию SELECT 0
и SELECT 4
?
Ответы
Ответ 1
Спасибо за все ответы!
После обсуждения я понял, что использование таблицы чисел не слишком сложно и работает хорошо и быстро на обеих платформах:
CREATE TABLE integers (i integer);
INSERT INTO integers (i) VALUES (0);
INSERT INTO integers (i) VALUES (1);
...
INSERT INTO integers (i) VALUES (9);
SELECT (hundreds.i * 100) + (tens.i * 10) + units.i AS x
FROM integers AS units
CROSS JOIN integers AS tens
CROSS JOIN integers AS hundreds
Вы просто создаете эту таблицу один раз и можете использовать ее всякий раз, когда вам нужен диапазон чисел.
Ответ 2
Хорошо на SQL-сервере (и PostgreSQL) я бы использовал рекурсивное общее табличное выражение: SQL Server, PostgreSQL
with recursive Numbers as (
select 0 as Number
union all
select Number + 1
from Numbers
where Number < 4
)
select Number
from Numbers
Пример FIDDLE SQL
Но, насколько я знаю, в SQLite нет WITH WITH.
Таким образом, возможные решения могут быть
- создать определенную пользователем функцию (this может быть полезно)
-
создайте таблицу с номерами от 0 до максимального числа, которое вам когда-либо понадобится, а затем просто выберите из нее, как это:
select Number from Numbers where Number >= 0 and Number <= 4
Ответ 3
Простой способ сделать это в PostgreSQL и SQLite выглядит следующим образом:
sqlite> select 1 union select 2 union select 3;
1
2
3
Он должен работать в большинстве систем РСУБД, но IIRC в Oracle вам придется использовать:
select 1 from dual union select 2 from dual union select 3 from dual;
Но у меня нет базы данных Oracle, чтобы проверить ее.
Ответ 4
Другая альтернатива (в постгресах, но должна работать с другими)
select (0) as count union values (1),(2),(3),(4),(5)
Расширение этого кода sql будет прямым.