복붙노트

[SQL] SQL 쿼리는 값 목록에 여러 범위에 대한 일치하는 번호 목록을 번역하기

SQL

SQL 쿼리는 값 목록에 여러 범위에 대한 일치하는 번호 목록을 번역하기

나는 우선 순위 열을 기준으로 정렬 된 값의 목록에 특정 범위 내에 번호의 목록을 변환해야합니다. 표는 다음과 같은 값을가집니다 :

| YEAR | R_MIN |  R_MAX | VAL | PRIO |
------------------------------------
  2010   18000    90100   52    6
  2010  240000   240099   82    3
  2010  250000   259999   50    5
  2010  260000   260010   92    1
  2010  330000   330010   73    4
  2010  330011   370020   50    5
  2010  380000   380050   84    2

범위는 다른 년 다를 수 있습니다. 1 년 이내 범위는 중복 않습니다.

입력은 년 하나에이 범위를 넘어 수있는 번호 목록이 될 것입니다. 입력 번호의리스트는, 1 내지 10 참조 작을 것이다. 입력 번호의 예 :

(20000, 240004, 375000, 255000)

그 입력으로 나는 우선 열, 또는 단일 값으로 정렬 된 목록을 좀하고 싶습니다 :

82
50
52

UNIQUE 및 MAX_RESULTS = 1 할 것이다, 그래서 내가 여기에 관심이있는 유일한 값은 82이다. 그것은 쉽게 번호 당 하나 개의 쿼리를 수행 할 수 있습니다, 다음 자바 코드에서 정렬,하지만 난 하나의 SQL 쿼리를 수행하는 것을 선호합니다.

SQL 쿼리, Oracle 데이터베이스에서 실행하려면 어떻게 나에게 원하는 결과를 줄 것이다?

(참고, 이는 서로 다른 열 범위에 정의 된 값의리스트에서 각각의 값과 일치 관하여, 분리에 대한 입력 문자열이 아니다.)

해결법

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

    1.난 당신이 각각의 숫자에로 문자열 및 분할과 같은 숫자의 집합을 전달하려는 추측하고있다. 오라클은 내장 토크 나이가 제공되지 않기 때문에, 열심히 당신이 생각하는 것보다입니다. 이상한, 응?

    난 당신이 각각의 숫자에로 문자열 및 분할과 같은 숫자의 집합을 전달하려는 추측하고있다. 오라클은 내장 토크 나이가 제공되지 않기 때문에, 열심히 당신이 생각하는 것보다입니다. 이상한, 응?

    다스 Interwabs 주위에 노크 솔루션 토크 나이 PL / SQL의 숫자가있다. 나는 정규식 (따라서 오직 오라클 10g 이상)을 사용 아누 프 PANI의 구현의 변형을 사용하고 있습니다. 내 변형 내가 SQL 유형으로 선언 한 숫자의 배열을 반환합니다 :

    SQL> create or replace type numbers as table of number
      2  /
    
    Type created.
    
    SQL>
    

    이것은 내가 SELECT 문에서 TABLE () 함수의 입력으로 사용할 수 있다는 것을 의미합니다 :

    SQL> select * from table (str_to_number_tokens('20000, 240004, 375000, 255000'))
      2  /
    
    COLUMN_VALUE
    ------------
           20000
          240004
          375000
          255000
    
    SQL>
    

    이것은 내가 다음과 같이 쿼리에 조인 할 수있는 테이블에 숫자의 당신의 문자열을 설정할 수 있습니다 의미합니다 :

    SQL> select val
      2  from t23
      3       , ( select column_value as i_no
      4           from table (str_to_number_tokens('20000, 240004, 375000, 255000')) ) sq
      5  where t23.year = 2010
      6  and   sq.i_no between t23.r_min and t23.r_max
      7  order by t23.priority
      8  /
    
           VAL
    ----------
            82
            50
            52
    
    SQL>
    
  2. ==============================

    2.나는 당신의 첫 번째 작업은 당신이 가입 할 수있는 결과 집합 (예. 메모리 테이블)에 번호 목록을 변환하는 것입니다 생각합니다. 나는 오라클을 모르는, 그래서 그것을 할 수있는 쉬운 방법이있을 수 있지만, 그렇지 않으면 당신은이 작업을 수행하는 사용자 정의 함수의 어떤 종류를 작성해야합니다. 그것은 너무 열심히하지 않아야하고 목록이 작기 때문에 성능은 문제가되지 않습니다. 그런 다음 그 테이블에 가입 할 수 있습니다. 이 같은:

    나는 당신의 첫 번째 작업은 당신이 가입 할 수있는 결과 집합 (예. 메모리 테이블)에 번호 목록을 변환하는 것입니다 생각합니다. 나는 오라클을 모르는, 그래서 그것을 할 수있는 쉬운 방법이있을 수 있지만, 그렇지 않으면 당신은이 작업을 수행하는 사용자 정의 함수의 어떤 종류를 작성해야합니다. 그것은 너무 열심히하지 않아야하고 목록이 작기 때문에 성능은 문제가되지 않습니다. 그런 다음 그 테이블에 가입 할 수 있습니다. 이 같은:

    SELECT yt.val
    FROM your_table yt
    JOIN your_parse_numbers_function(@inputlist) il
    ON il.value >= yt.R_MIN AND il.value <= yt.R_MAX
    WHERE yt.YEAR = @year
    

    원하는 경우는 1 개 결과를 제한 할 수 있지만, 범위가 중복되지 대한 가정이 맞다면 그것은 단지 하나 개 어쨌든을 반환해야합니다.

  3. from https://stackoverflow.com/questions/2635930/sql-query-to-translate-a-list-of-numbers-matched-against-several-ranges-to-a-li by cc-by-sa and MIT license