Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL-Abfrage zum Übersetzen einer Liste von Zahlen, die mit mehreren Bereichen abgeglichen werden, in eine Liste von Werten

Ich vermute, Sie möchten diesen Zahlensatz als Zeichenfolge übergeben und in einzelne Zahlen aufteilen. Das ist schwieriger, als Sie vielleicht denken, weil Oracle keinen eingebauten Tokenizer hat. Seltsam, oder?

Es gibt eine Reihe von PL/SQL-Tokenizer-Lösungen, die bei Das Interwabs herumschwirren. Ich verwende eine Variante der Implementierung von Anup Pani, die Regex verwendet (daher nur Oracle 10g oder höher). Meine Variante gibt ein Array von Zahlen zurück, die ich als SQL-Typ deklariert habe:

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

Type created.

SQL>

Das bedeutet, dass ich es als Eingabe für eine TABLE()-Funktion in einer SELECT-Anweisung verwenden kann:

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

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

SQL>

Das bedeutet, dass ich Ihre Zahlenfolge in eine Tabelle umwandeln kann, die ich in einer Abfrage wie dieser verknüpfen kann:

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>