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

Få anden kamp fra regexp_matches resultater

Du kan bruge REGEXP_REPLACE :

SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
 

Output

7654321
 

Dette regexp leder efter en streng, der starter med et eller andet antal cifre (^\d+ ) efterfulgt af nogle ikke-cifrede tegn ([^\d]+ ) og derefter en anden gruppe af cifre ((\d+) ) efterfulgt af et vist antal tegn indtil slutningen af ​​strengen (.*$ ). () omkring den anden gruppe af ciffertegn gør det til en opfangende gruppe, som vi så kan henvise til i erstatningsstrengen med \1 . Siden REGEXP_REPLACE erstatter kun de dele af strengen, der matcher regex, er det nødvendigt at have et regex, der matcher hele streng for at erstatte den med kun de ønskede data.

Opdater

Hvis der potentielt er tegn før det første sæt cifre, skal du ændre regex til

^[^\d]*\d+[^\d]+(\d+).*$

Opdatering 2

Hvis det er muligt, at der kun er ét sæt tal i begyndelsen, skal vi gøre matchning af den første del valgfri. Vi kan gøre det med en ikke-fangende gruppe:

^[^\d]*(?:\d+[^\d]+)?(\d+).*$

Dette gør matchningen på det første sæt cifre valgfri, så hvis den ikke eksisterer (dvs. der kun er ét sæt cifre), vil regex stadig matche. Ved at bruge en ikke-indfangende gruppe (tilføje ?: til begyndelsen af ​​gruppen behøver vi ikke at ændre erstatningsstrengen fra \1 . Opdateret SQLFiddle



  1. korrekt dvale-annotering for byte[]

  2. mysql trigger med insert og opdatering efter insert på tabel

  3. MySQL INSERT ... PÅ DUBLIKAT NØGLOPDATERING på Java:Sådan adskiller du indsatte/opdaterede/NoChange-tilstande

  4. ALTER TABLE-sætningen var i konflikt med CHECK-begrænsningen i SQL Server - SQL Server / TSQL Selvstudium, del 89