SQL для генерации списка чисел от 1 до 100 - PullRequest
41 голосов
/ 17 мая 2010

Используя таблицу DUAL, как получить список чисел от 1 до 100?

Ответы [ 12 ]

68 голосов
/ 17 мая 2010

Ваш вопрос сложен для понимания, но если вы хотите выбрать цифры от 1 до 100, то это должно сработать:

Select Rownum r
From dual
Connect By Rownum <= 100
23 голосов
/ 17 мая 2010

Еще одно интересное решение в ORACLE PL / SQL:

    SELECT LEVEL n
      FROM DUAL
CONNECT BY LEVEL <= 100;
12 голосов
/ 17 ноября 2013

Сделай это трудным путем. Используйте классное предложение MODEL:

SELECT V
FROM DUAL
MODEL DIMENSION BY (0 R)
      MEASURES (0 V)
      RULES ITERATE (100) (
        V[ITERATION_NUMBER] = ITERATION_NUMBER + 1
      )
ORDER BY 1

Доказательство: http://sqlfiddle.com/#!4/d41d8/20837

7 голосов
/ 17 мая 2010

Питер тоже мой любимый ответ.

Если вам нужна более подробная информация, то здесь есть хороший обзор, ИМО, здесь .
Особенно интересно прочитать тесты .

5 голосов
/ 13 июля 2018

Используя пункт фабрики вложенных запросов Oracle: «WITH», вы можете выбрать числа от 1 до 100:

WITH t(n) AS (
  SELECT 1 from dual
  UNION ALL
    SELECT n+1 FROM t WHERE n < 100
)
SELECT * FROM t;
5 голосов
/ 16 июня 2016

Если вы хотите, чтобы ваши целые числа были связаны между двумя целыми числами (то есть начинаются с чего-то, отличного от 1), вы можете использовать что-то вроде этого:

with bnd as (select 4 lo, 9 hi from dual)
select (select lo from bnd) - 1 + level r
from dual
connect by level <= (select hi-lo from bnd);

Это дает:

4
5
6
7
8
4 голосов
/ 20 февраля 2018

Вы можете использовать XMLTABLE:

SELECT rownum
FROM XMLTABLE('1 to 100');

Демоверсия DBFiddle

1 голос
/ 04 сентября 2017

Использование GROUP BY CUBE:

SELECT ROWNUM
FROM (SELECT 1 AS c FROM dual GROUP BY CUBE(1,1,1,1,1,1,1) ) sub
WHERE ROWNUM <=100;

Rextester Demo

0 голосов
/ 30 ноября 2017

Вот интересный способ создать таблицу чисел. Он не использует таблицу DUAL, но если таблица DUAL когда-либо исчезнет, ​​это может быть резервный план.

DECLARE @TotalNumbers INT = 100;

DECLARE @From DATETIME = CONVERT(DATETIME, CONVERT(DATE, GETDATE())),
        @To DATETIME = DATEADD(SECOND, @TotalNumbers - 1, CONVERT(DATETIME, CONVERT(DATE, GETDATE())));

WITH AlmostNumberTable (Hola)
AS (SELECT @From
    UNION ALL
    SELECT DATEADD(SECOND, 1, Hola)
    FROM AlmostNumberTable
    WHERE Hola< @To
   )
SELECT [Number]
FROM
(
    SELECT DATEPART(MINUTE, AlmostNumberTable.Hola) * 60 + DATEPART(SECOND, AlmostNumberTable.Hola) + 1 AS [Number]
    FROM AlmostNumberTable
) AS NumberTable;

Возможно, это чепуха, но это рабочее решение, и было весело писать.

0 голосов
/ 14 сентября 2016

Я создал функцию Oracle, которая возвращает таблицу чисел

CREATE OR REPLACE FUNCTION [schema].FN_TABLE_NUMBERS(
    NUMINI INTEGER,
    NUMFIN INTEGER,
    EXPONENCIAL INTEGER DEFAULT 0
) RETURN TBL_NUMBERS
IS
    NUMEROS TBL_NUMBERS;
    INDICE NUMBER;
BEGIN
    NUMEROS := TBL_NUMBERS();

    FOR I IN (
        WITH TABLA AS (SELECT NUMINI, NUMFIN FROM DUAL)
        SELECT NUMINI NUM FROM TABLA UNION ALL
        SELECT 
            (SELECT NUMINI FROM TABLA) + (LEVEL*TO_NUMBER('1E'||TO_CHAR(EXPONENCIAL))) NUM
        FROM DUAL
        CONNECT BY 
            (LEVEL*TO_NUMBER('1E'||TO_CHAR(EXPONENCIAL))) <= (SELECT NUMFIN-NUMINI FROM TABLA)
    ) LOOP
        NUMEROS.EXTEND;
        INDICE := NUMEROS.COUNT; 
        NUMEROS(INDICE):= i.NUM;
    END LOOP;

    RETURN NUMEROS;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
       RETURN NUMEROS;
  WHEN OTHERS THEN
       RETURN NUMEROS;
END;
/

Необходимо создать новый тип данных:

CREATE OR REPLACE TYPE [schema]."TBL_NUMBERS" IS TABLE OF NUMBER;
/

Использование:

SELECT COLUMN_VALUE NUM FROM TABLE([schema].FN_TABLE_NUMBERS(1,10))--integers difference: 1;2;.......;10

А если вам нужны десятичные числа между числами по экспоненциальной записи:

SELECT COLUMN_VALUE NUM FROM TABLE([schema].FN_TABLE_NUMBERS(1,10,-1));--with 0.1 difference: 1;1.1;1.2;.......;10
SELECT COLUMN_VALUE NUM FROM TABLE([schema].FN_TABLE_NUMBERS(1,10,-2));--with 0.01 difference: 1;1.01;1.02;.......;10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...