SQL生成1到100之间的数字列表

时间:2010-05-17 07:19:48

标签: sql oracle plsql

使用DUAL表,如何获得1到100之间的数字列表?

12 个答案:

答案 0 :(得分:68)

您的问题很难理解,但如果您想从1100选择数字,那么这应该可以解决问题:

Select Rownum r
From dual
Connect By Rownum <= 100

答案 1 :(得分:23)

ORACLE PL / SQL中另一个有趣的解决方案:

    SELECT LEVEL n
      FROM DUAL
CONNECT BY LEVEL <= 100;

答案 2 :(得分:12)

这样做很难。使用awesome 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

答案 3 :(得分:7)

彼得的回答也是我最喜欢的。

如果您正在寻找更多详细信息,请提供一个非常好的概述,IMO,here 特别有趣的是阅读benchmarks

答案 4 :(得分:5)

如果你希望你的整数绑定在两个整数之间(即从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

答案 5 :(得分:3)

您可以使用XMLTABLE

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

<强> DBFiddle Demo

答案 6 :(得分:3)

使用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;

答案 7 :(得分:1)

使用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

答案 8 :(得分:0)

彼得的一个例子,它演示了一种可用于生成0到99之间所有数字的方法。

with digits as (
  select mod(rownum,10) as num 
  from   dual 
  connect by rownum <= 10
)
select a.num*10+b.num as num 
from   digits a
       ,digits b
order by num
;

当您进行批量标识符分配并查找尚未分配的项目时,这样的内容会变得很有用。

例如,如果您正在销售宾果票,您可能需要分配100个楼层的员工(猜测我曾经如何为体育运动筹集资金)。当他们出售批次时,他们将按顺序进行下一批。但是,购买门票的人可以选择从批次中购买任何门票。可能会问这个问题,&#34;已售出的门票&#34;。

在这种情况下,我们只有一个部分的,随机的,在给定批次中返回的故障单列表,并要求提供所有可能性的完整列表,以确定我们没有。

with range as (
  select mod(rownum,100) as num 
  from   dual 
  connect by rownum <= 100
),
AllPossible as (
  select a.num*100+b.num as TicketNum
  from   batches a
         ,range b
  order by num
)
select TicketNum as TicketsSold
from   AllPossible
where  AllPossible.Ticket not in (select TicketNum from TicketsReturned)
;

对于关键词的使用,我从一个真实世界的例子中改变了一些变量名。

...要证明为什么这样的事情会有用

答案 9 :(得分:0)

我创建了一个返回数字表

的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

如果您需要使用exponencial表示法在数字之间使用小数:

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

答案 10 :(得分:0)

这是一种生成数字表的有趣方式。它不使用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;

这可能是胡说八道,但这是一个有效的解决方案,写作很有趣。

答案 11 :(得分:-1)

SELECT * FROM `DUAL` WHERE id>0 AND id<101

以上查询是用SQL编写的。