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

REGEX per selezionare l'ennesimo valore da un elenco, consentendo valori null

Grazie a chi ha risposto. Dopo aver esaminato le tue risposte e le risposte nel link fornito, sono arrivato a questa soluzione:

SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
  2  from dual;

Data
----

Che può essere descritto come "guarda la 2a occorrenza di un insieme facoltativo di zero o più caratteri seguiti da una virgola o dalla fine della riga, e restituisce il 1o sottogruppo (che sono i dati meno la virgola o la fine del riga).

Ho dimenticato di dire che ho testato con il null in varie posizioni, più null, selezionando varie posizioni, ecc.

L'unico avvertimento che potrei trovare è che se il campo che cerchi è maggiore del numero disponibile, restituisce semplicemente NULL, quindi devi esserne consapevole. Nessun problema per il mio caso.

EDIT:sto aggiornando la risposta accettata a beneficio dei futuri ricercatori che potrebbero imbattersi in questo.

Il passaggio successivo consiste nell'incapsulare il codice in modo che possa essere trasformato in una funzione più semplice e riutilizzabile. Ecco la fonte della funzione:

  FUNCTION  GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
    BEGIN
      RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1);
  END GET_LIST_ELEMENT;

Ciò nasconde le complessità delle espressioni regolari agli sviluppatori che potrebbero non essere così a proprio agio con esso e rende comunque il codice più pulito quando è in uso. Chiamalo in questo modo per ottenere il 4° elemento:

select get_list_element('123,222,,432,555', 4) from dual;