Możesz użyć REGEXP_REPLACE
:
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Wyjście
7654321
To wyrażenie regularne szuka łańcucha zaczynającego się od pewnej liczby cyfr (^\d+
) po którym następuje kilka znaków niebędących cyframi ([^\d]+
), a następnie kolejna grupa cyfr ((\d+)
), po której następuje pewna liczba znaków do końca ciągu (.*$
). ()
wokół drugiej grupy znaków cyfrowych sprawia, że jest to grupa przechwytywania, do której możemy następnie odwołać się w ciągu zastępczym za pomocą \1
. Od REGEXP_REPLACE
zastępuje tylko te części ciągu, które pasują do wyrażenia regularnego, konieczne jest posiadanie wyrażenia pasującego do całości string, aby zastąpić go tylko żądanymi danymi.
Aktualizacja
Jeśli przed pierwszym zestawem cyfr potencjalnie znajdują się znaki, należy zmienić wyrażenie regularne na
^[^\d]*\d+[^\d]+(\d+).*$
Aktualizacja 2
Jeśli jest możliwe, że na początku jest tylko jeden zestaw liczb, musimy sprawić, by dopasowanie pierwszej części było opcjonalne. Możemy to zrobić z grupą nieprzechwytującą:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
To sprawia, że dopasowanie pierwszego zestawu cyfr jest opcjonalne, więc jeśli nie istnieje (tj. jest tylko jeden zestaw cyfr), wyrażenie regularne nadal będzie pasować. Używając grupy nieprzechwytującej (dodając ?:
na początek grupy, nie musimy zmieniać ciągu zastępczego z \1
. Zaktualizowano SQLFiddle