使用DUAL表,如何获得1到100之间的数字列表?
答案 0 :(得分:68)
您的问题很难理解,但如果您想从1
到100
选择数字,那么这应该可以解决问题:
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
答案 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)
答案 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编写的。