sql >> Base de Datos >  >> RDS >> Oracle

Consulta SQL para traducir una lista de números que coinciden con varios rangos, a una lista de valores

Supongo que desea pasar ese conjunto de números como una cadena y dividirlo en números individuales. Esto es más difícil de lo que piensa, porque Oracle no viene con un tokenizador incorporado. Raro, ¿eh?

Hay una serie de soluciones tokenizadoras PL/SQL dando vueltas en Das Interwabs. Estoy usando una variante de la implementación de Anup Pani, que usa Regex (por lo tanto, solo Oracle 10g o superior). Mi variante devuelve una matriz de números que he declarado como tipo SQL:

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

Type created.

SQL>

Esto significa que puedo usarlo como entrada para una función TABLE() en una instrucción SELECT:

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

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

SQL>

Esto significa que puedo convertir su cadena de números en una tabla a la que puedo unirme en una consulta, como esta:

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>