Oracle
 sql >> Database >  >> RDS >> Oracle

Query SQL per tradurre un elenco di numeri corrispondenti a diversi intervalli in un elenco di valori

Immagino tu voglia passare quell'insieme di numeri come una stringa e dividerlo in singoli numeri. Questo è più difficile di quanto potresti pensare, perché Oracle non viene fornito con un tokenizzatore integrato. Strano, eh?

Esistono numerose soluzioni di tokenizer PL/SQL che aggirano Das Interwabs. Sto usando una variante dell'implementazione di Anup Pani, che utilizza Regex (quindi solo Oracle 10g o superiore). La mia variante restituisce una matrice di numeri che ho dichiarato come tipo SQL:

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

Type created.

SQL>

Ciò significa che posso usarlo come input per una funzione TABLE() in un'istruzione SELECT:

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

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

SQL>

Ciò significa che posso trasformare la tua stringa di numeri in una tabella a cui posso unirmi in una query, come questa:

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>