Oracle
 sql >> Base de données >  >> RDS >> Oracle

Requête SQL pour traduire une liste de nombres correspondant à plusieurs plages en une liste de valeurs

Je suppose que vous voulez transmettre cet ensemble de nombres sous forme de chaîne et le diviser en nombres individuels. C'est plus difficile que vous ne le pensez, car Oracle n'est pas livré avec un tokenizer intégré. Bizarre, hein ?

Il existe un certain nombre de solutions de tokenisation PL/SQL autour de Das Interwabs. J'utilise une variante de l'implémentation d'Anup Pani, qui utilise Regex (donc uniquement Oracle 10g ou supérieur). Ma variante renvoie un tableau de nombres que j'ai déclaré comme type SQL :

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

Type created.

SQL>

Cela signifie que je peux l'utiliser comme entrée d'une fonction TABLE() dans une instruction SELECT :

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

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

SQL>

Cela signifie que je peux transformer votre chaîne de nombres en une table à laquelle je peux me joindre dans une requête, comme ceci :

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>