ORACLE SQL:获取两个数字之间的所有整数

ORACLE SQL:获取两个数字之间的所有整数,sql,oracle,numbers,Sql,Oracle,Numbers,在Oracle中,是否有任何方法可以使用SQL选择包含在两个数字之间的数字整数;我不想创建PL/SQL过程或函数 例如,我需要得到3到10之间的数字。结果将是值3,4,5,6,7,8,9,10 Thx 创建新数据库时,我要做的第一件事是创建和填充一些基本表 一个是-N到N之间的所有整数的列表,另一个是过去5年到未来10年的日期列表计划作业可以根据需要继续创建这些,向前,最后一个是一天中所有小时的列表。例如,inetgers: create table numbers (n integer pri

在Oracle中,是否有任何方法可以使用SQL选择包含在两个数字之间的数字整数;我不想创建PL/SQL过程或函数

例如,我需要得到3到10之间的数字。结果将是值3,4,5,6,7,8,9,10

Thx

创建新数据库时,我要做的第一件事是创建和填充一些基本表

一个是-N到N之间的所有整数的列表,另一个是过去5年到未来10年的日期列表计划作业可以根据需要继续创建这些,向前,最后一个是一天中所有小时的列表。例如,inetgers:

create table numbers (n integer primary key);
insert into numbers values (0);
insert into numbers select n+1 from numbers; commit;
insert into numbers select n+2 from numbers; commit;
insert into numbers select n+4 from numbers; commit;
insert into numbers select n+8 from numbers; commit;
insert into numbers select n+16 from numbers; commit;
insert into numbers select n+32 from numbers; commit;
insert into numbers select n+64 from numbers; commit;
insert into numbers select n+128 from numbers; commit;
insert into numbers select n+256 from numbers; commit;
insert into numbers select n+512 from numbers; commit;
insert into numbers select n+1024 from numbers; commit;
insert into numbers select n+2048 from numbers; commit;
insert into numbers select n+4096 from numbers; commit;
insert into numbers select n+8192 from numbers; commit;
insert into numbers select -n from numbers where n > 0; commit;
这是针对具有自动事务启动的DB2/z的,这就是为什么它似乎具有裸提交

是的,它占用的空间很小,但只需从这些表中选择值,就可以使查询更容易编写。它在几乎所有基于SQL的DBMS中都是非常可移植的

然后,您的特定查询将是一个简单的:

select n from numbers where n >=3 and n <= 10;
我们可以得到:

Date       | Quantity
-----------+---------
2009-01-01 |        7
2009-01-02 |        0
2009-01-03 |       27
2009-01-04 |        6
或者你可以使用

Select Column1 from dummy_table where Column2 Between 3 and 10

Oracle双表的这一技巧同样有效:

SQL> select n from
  2  ( select rownum n from dual connect by level <= 10)
  3  where n >= 3;

         N
----------
         3
         4
         5
         6
         7
         8
         9
        10
这和托尼的一样。请注意,当您使用SQL*Plus 9时,您必须使此查询成为Tony向您展示的内联视图。在SQL*加上10或更高版本中,以上内容就足够了

问候,,
Rob.

您可以为此使用MODEL子句

SELECT c1 from dual
  MODEL DIMENSION BY (1 as rn)  MEASURES (1 as c1)
  RULES ITERATE (7)
  (c1[ITERATION_NUMBER]=ITERATION_NUMBER+7)

Gary,为了显示他解释的结果,模型查询将是:

选择c1 来自双重 模型尺寸以1表示为rn 措施1作为c1 规则迭代8次 c1[迭代次数]=迭代次数+3 rn订购

)

我总是使用:

选择级别-1+3作为结果 来自双重
通过级别连接我刚刚在SQL server中实现了一个表值函数,如果有人对此感兴趣,它可以完美地工作

CREATE FUNCTION [dbo].[NumbersBetween]
(
    @StartN int,
    @EndN int
)
RETURNS 
@NumberList table
(
    Number int
)

AS

BEGIN

WHILE @StartN <= @EndN
    BEGIN
    insert into @NumberList
    VALUES (@StartN)
    set @StartN = @StartN + 1
    END

Return

END
GO

这一行查询将帮助您

select level lvl from dual where level<:upperbound and 

                              level >:lowerbound connect by level<:limt
对于您的情况:

select level lvl from dual where level<10 and level >3 connect by level<11

如果有任何澄清,请告诉我。

这是一个延迟添加。但解决方案似乎更优雅、更易于使用

它使用必须安装一次的流水线功能:

CREATE TYPE number_row_type AS OBJECT 
(
  num NUMBER
);

CREATE TYPE number_set_type AS TABLE OF number_row_type;

CREATE OR REPLACE FUNCTION number_range(p_start IN PLS_INTEGER, p_end IN PLS_INTEGER)
    RETURN number_set_type
    PIPELINED
IS
    out_rec number_row_type := number_row_type(NULL);

BEGIN
  FOR i IN p_start .. p_end LOOP
    out_rec.num := i;
    pipe row(out_rec);
  END LOOP;

END number_range;
/
然后你可以这样使用它:

select * from table(number_range(1, 10));

NUM
---
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10

解决方案是Oracle特有的。

从范围生成数字的一种方法是使用XMLTABLE“从开始到结束”:

我添加到了_NUMBER,因为列_值是一个字符串


我想共享一个有用的查询,该查询将逗号和“-”分隔的数字列表字符串转换为等效的扩展数字列表:

将“1,2,3,50-60”转换为

1 2 3 50 51 ... 60
您可以将其用作视图并对“1,2,3,50-60”字符串进行参数化

除了已经提供的答案外,还可以将listagg函数与connect by结合使用,以获得问题中提到的格式的结果。请参见下面的代码示例:

create table numbers (value number);

declare
    x number;
begin
    for x in 7 .. 25
    loop
        insert into numbers values (x);
    end loop;
end;
/
SELECT 
   DBMS_LOB.SUBSTR(LISTAGG(S.INTEGERS,',' ) WITHIN GROUP (ORDER BY S.INTEGERS), 300,1) RESULT 
FROM 
   (SELECT 
      INTEGERS 
   FROM 
      ( SELECT ROWNUM INTEGERS FROM DUAL CONNECT BY LEVEL <= 10) 
   WHERE 
      INTEGERS >= 3 
   ) S;

这种方法最好的地方是在Oracle10g及更高版本中,它不需要块读取:漂亮而简单,喜欢它!我用它来查找一个范围内所有缺失的值:从select n from select rownum n from dual connect by level我一直使用这个值。通常,为已知良好值创建一个空行的结果集,该值需要制表计数等,但不会出现在数据库记录中。是的,我能。但是,结果是一样的:
SELECT TO_NUMBER(column_value)  integer_value
FROM XMLTABLE('3 to 10');
1 2 3 50 51 ... 60
select distinct * from (SELECT (LEVEL - 1) + mini as result FROM (select REGEXP_SUBSTR (value, '[^-]+', 1, 1)mini ,nvl(REGEXP_SUBSTR (value, '[^-]+', 1, 2),0) maxi from (select REGEXP_SUBSTR (value, '[^,]+', 1, level) as value from (select '1,2,3,50-60' value from dual) connect by level <= length(regexp_replace(value,'[^,]*'))+1)) CONNECT BY Level <= (maxi-mini+1)) order by 1 asc;
create table numbers (value number);

declare
    x number;
begin
    for x in 7 .. 25
    loop
        insert into numbers values (x);
    end loop;
end;
/
SELECT 
   DBMS_LOB.SUBSTR(LISTAGG(S.INTEGERS,',' ) WITHIN GROUP (ORDER BY S.INTEGERS), 300,1) RESULT 
FROM 
   (SELECT 
      INTEGERS 
   FROM 
      ( SELECT ROWNUM INTEGERS FROM DUAL CONNECT BY LEVEL <= 10) 
   WHERE 
      INTEGERS >= 3 
   ) S;
SQL> 
RESULT
----------------
3,4,5,6,7,8,9,10