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 будет прямым.