sql >> Database >  >> RDS >> PostgreSQL

Haal de tweede match uit de resultaten van regexp_matches

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



  1. hoe namen van partities in orakel te krijgen terwijl ik een datum invoer

  2. Bereken een lopend totaal in SQL Server

  3. Hoe regelafstand tussen regels in Textarea te verwijderen?

  4. GROUP_CONCAT met JOINLEFT in Zend Db Select