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