Potresti usare REGEXP_REPLACE
:
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Uscita
7654321
Questa espressione regolare cerca una stringa che inizia con un certo numero di cifre (^\d+
) seguito da alcuni caratteri non numerici ([^\d]+
) e poi un altro gruppo di cifre ((\d+)
) seguito da un certo numero di caratteri fino alla fine della stringa (.*$
). Il ()
attorno al secondo gruppo di caratteri delle cifre si crea un gruppo di acquisizione, a cui possiamo quindi fare riferimento nella stringa sostitutiva con \1
. Da REGEXP_REPLACE
sostituisce solo le parti della stringa che corrispondono alla regex, è necessario avere una regex che corrisponda al intero stringa per sostituirla solo con i dati desiderati.
Aggiorna
Se ci sono potenzialmente caratteri prima del primo set di cifre, dovresti cambiare l'espressione regolare in
^[^\d]*\d+[^\d]+(\d+).*$
Aggiorna 2
Se è possibile che all'inizio ci sia solo un insieme di numeri, dobbiamo rendere facoltativo l'abbinamento della prima parte. Possiamo farlo con un gruppo che non cattura:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
Ciò rende facoltativa la corrispondenza sul primo set di cifre in modo che se non esiste (cioè c'è solo un set di cifre) la regex continuerà a corrispondere. Utilizzando un gruppo non di acquisizione (aggiungendo il ?:
all'inizio del gruppo, non è necessario modificare la stringa di sostituzione da \1
. SQLFiddle
aggiornato