복붙노트

[SQL] 오라클 SQL은 두 숫자 사이의 모든 정수를 가져옵니다

SQL

오라클 SQL은 두 숫자 사이의 모든 정수를 가져옵니다

오라클 SQL과 두 숫자 사이에 포함 된 숫자 (정수)를 선택하는 방법은 없나요; 나는 PL / SQL 프로시 저나 함수를 생성하고 싶지 않아요.

예를 들어 나는 3과 10 결과가 될 것입니다 값 3,4,5,6,7,8,9,10 사이의 숫자를 얻을 필요가있다.

고마워.

해결법

  1. ==============================

    1.오라클의 DUAL 테이블이 트릭도 작동합니다 :

    오라클의 DUAL 테이블이 트릭도 작동합니다 :

    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
    
  2. ==============================

    2.내가 만들 때 내가 할 첫 번째 일은 새 데이터베이스는 몇 가지 기본적인 테이블을 작성하고 채울 것입니다.

    내가 만들 때 내가 할 첫 번째 일은 새 데이터베이스는 몇 가지 기본적인 테이블을 작성하고 채울 것입니다.

    하나는 -N와 N 사이의 모든 정수의 목록입니다, 다른 하나는 미래 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;
    

    시간 수치 및 날짜 범위는 우리가 일을보고 응용 프로그램의 종류에 매우 유용합니다. 그것은 우리가 (매월 두 번째 날에 데이터가 없습니다 경우) 대신에, 그래서 실제 데이터가없는 그 날의 시간 (또는 날짜)에 대해 0 항목을 만들 수 있습니다 :

    Date       | Quantity
    -----------+---------
    2009-01-01 |        7
    2009-01-03 |       27
    2009-01-04 |        6
    

    우리는 대신 얻을 수 있습니다 :

    Date       | Quantity
    -----------+---------
    2009-01-01 |        7
    2009-01-02 |        0
    2009-01-03 |       27
    2009-01-04 |        6
    
  3. ==============================

    3.

    SQL> var N_BEGIN number
    SQL> var N_END number
    SQL> exec :N_BEGIN := 3; :N_END := 10
    
    PL/SQL procedure successfully completed.
    
    SQL>  select :N_BEGIN + level - 1 n
      2     from dual
      3  connect by level <= :N_END - :N_BEGIN + 1
      4  /
    
             N
    ----------
             3
             4
             5
             6
             7
             8
             9
            10
    
    8 rows selected.
    

    이 토니의 같은 트릭을 사용합니다. 참고는 SQL * 플러스 (9)을 사용하는 경우, 당신은 토니와 같은 인라인 뷰를 보여이 쿼리를 만들어야 할 것이다. SQL * Plus를 10 이상으로, 위에서 충분하다.

    문안 인사, 롭.

  4. ==============================

    4.당신은이에 대한 MODEL 절을 사용할 수 있습니다.

    당신은이에 대한 MODEL 절을 사용할 수 있습니다.

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

    5.이 한 줄의 쿼리는 당신을 도울 것입니다,

    이 한 줄의 쿼리는 당신을 도울 것입니다,

    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
    

    내가 어떤 해명 경우 알려 주시기 바랍니다.

  6. ==============================

    6.또는 당신은 사이에 사용할 수 있습니다

    또는 당신은 사이에 사용할 수 있습니다

    Select Column1 from dummy_table where Column2 Between 3 and 10
    
  7. ==============================

    7.게리는, 그가 설명하는 결과를 보여, 모델 쿼리는 다음과 같습니다

    게리는, 그가 설명하는 결과를 보여, 모델 쿼리는 다음과 같습니다

    SELECT (C1) DUAL FROM 모델 DIMENSION BY (RN으로 1) 조치 (C1로서 1) RULES ITERATE (8) (C1 [ITERATION_NUMBER = ITERATION_NUMBER + 3) ORDER BY의 RN

    ;)

    난 항상 사용 :

    그 결과 + 3 - SELECT (1 LEVEL) 이중 FROM CONNECT BY 레벨 <= 8

    어디도 3은 시작 번호이며 8은 "반복"의 수입니다.

  8. ==============================

    8.이 늦은 추가되었습니다. 그러나 솔루션은 더 우아하고 사용하기 쉬운 것 같다.

    이 늦은 추가되었습니다. 그러나 솔루션은 더 우아하고 사용하기 쉬운 것 같다.

    그것은 한 번 설치해야합니다 파이프 라인 함수를 사용합니다 :

    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
    

    이 솔루션은 오라클 고유의 것입니다.

  9. ==============================

    9.범위에서 숫자를 생성하는 방법 중 하나는 ( '최종 시작') XMLTABLE을 사용하는 것입니다 :

    범위에서 숫자를 생성하는 방법 중 하나는 ( '최종 시작') XMLTABLE을 사용하는 것입니다 :

    SELECT column_value
    FROM XMLTABLE('3 to 10');
    

    DB 휘티 d 혀라도

  10. ==============================

    10.난 그냥 사람이 관심이 있다면,이 완벽하게 작동, SQL 서버에서이 작업을 수행 할 수있는 테이블 반환 함수를했다.

    난 그냥 사람이 관심이 있다면,이 완벽하게 작동, SQL 서버에서이 작업을 수행 할 수있는 테이블 반환 함수를했다.

    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
    

    (/ O 과정의 따옴표 W) 결과가 될 것 "dbo.NumbersBetween에서 선택 * (1,5)"당신은 쿼리를 실행하는 경우

    Number
    -------
    1
    2
    3
    4
    5
    
  11. ==============================

    11.'-'나는 회심 쉼표의 문자열과 그 유용한 쿼리 공유하고자하는 번호에 해당하는 확장 된 목록에 번호 목록을 구분 :

    '-'나는 회심 쉼표의 문자열과 그 유용한 쿼리 공유하고자하는 번호에 해당하는 확장 된 목록에 번호 목록을 구분 :

    회심 '1,2,3,50-60'에 그 예

    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;
    

    당신은보기로 사용하고 '1,2,3,50-60'문자열 변수화 할 수있다

  12. ==============================

    12.

    create table numbers (value number);
    
    declare
        x number;
    begin
        for x in 7 .. 25
        loop
            insert into numbers values (x);
        end loop;
    end;
    /
    
  13. from https://stackoverflow.com/questions/1453747/oracle-sqlget-all-integers-between-two-numbers by cc-by-sa and MIT license