PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ottieni la seconda corrispondenza dai risultati di regexp_matches

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