sql >> Databasteknik >  >> RDS >> Oracle

SQL-fråga för att översätta en lista med nummer som matchas mot flera intervall, till en lista med värden

Jag antar att du vill skicka den uppsättningen siffror som en sträng och delas upp i individuella nummer. Detta är svårare än du kanske tror, ​​eftersom Oracle inte kommer med en inbyggd tokenizer. Konstigt va?

Det finns ett antal PL/SQL-tokenizer-lösningar som knackar på Das Interwabs. Jag använder en variant av Anup Panis implementering, som använder Regex (därav endast Oracle 10g eller högre). Min variant returnerar en array av tal som jag har deklarerat som en SQL-typ:

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

Type created.

SQL>

Det betyder att jag kan använda den som en indata till en TABLE()-funktion i en SELECT-sats:

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

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

SQL>

Det betyder att jag kan förvandla din sträng med nummer till en tabell som jag kan ansluta till i en fråga, så här:

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>


  1. Skillnad mellan tidsstämplar med/utan tidszon i PostgreSQL

  2. Vad är Ångra och gör om i Oracle-databasen

  3. SQL Server:DELETE vs TRUNCATE

  4. Hämtar okänd primärnyckel för tabellen medan ID:t finns där