Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Consulta SQL para traduzir uma lista de números correspondentes a vários intervalos para uma lista de valores


Estou supondo que você deseja passar esse conjunto de números como uma string e dividir em números individuais. Isso é mais difícil do que você imagina, porque o Oracle não vem com um tokenizer embutido. Estranho, hein?

Há uma série de soluções de tokenizer PL/SQL surgindo no Das Interwabs. Estou usando uma variante da implementação do Anup Pani, que usa Regex (portanto, apenas Oracle 10g ou superior). Minha variante retorna uma matriz de números que declarei como um tipo SQL:
SQL> create or replace type numbers as table of number
  2  /

Type created.

SQL>

Isso significa que posso usá-lo como entrada para uma função TABLE() em uma instrução SELECT:
SQL> select * from table (str_to_number_tokens('20000, 240004, 375000, 255000'))
  2  /

COLUMN_VALUE
------------
       20000
      240004
      375000
      255000

SQL>

Isso significa que posso transformar sua sequência de números em uma tabela à qual posso ingressar em uma consulta, assim:
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>