Je zou REGEXP_REPLACE
. kunnen gebruiken :
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Uitgang
7654321
Deze regexp zoekt naar een tekenreeks die begint met een aantal cijfers (^\d+
) gevolgd door enkele niet-cijferige tekens ([^\d]+
) en dan nog een groep cijfers ((\d+)
) gevolgd door een aantal tekens tot het einde van de tekenreeks (.*$
). De ()
rond de tweede groep cijfertekens maakt dat een capture-groep, waarnaar we dan kunnen verwijzen in de vervangende string met \1
. Sinds REGEXP_REPLACE
vervangt alleen de delen van de tekenreeks die overeenkomen met de regex, het is noodzakelijk om een regex te hebben die overeenkomt met het geheel tekenreeks om deze te vervangen door alleen de gewenste gegevens.
Bijwerken
Als er mogelijk tekens vóór de eerste reeks cijfers staan, moet u de regex wijzigen in
^[^\d]*\d+[^\d]+(\d+).*$
Update 2
Als het mogelijk is dat er slechts één reeks getallen aan het begin staat, moeten we het matchen van het eerste deel optioneel maken. We kunnen dat doen met een niet-vastleggende groep:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
Dit maakt de overeenkomst op de eerste reeks cijfers optioneel, zodat als deze niet bestaat (d.w.z. er is slechts één reeks cijfers), de regex nog steeds overeenkomt. Door een niet-vastleggende groep te gebruiken (toevoegen van de ?:
naar het begin van de groep, hoeven we de vervangende tekenreeks niet te wijzigen van \1
. Bijgewerkt SQLFiddle