Можете да използвате REGEXP_REPLACE
:
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Изход
7654321
Този регулярен израз търси низ, започващ с определен брой цифри (^\d+
), последвано от някои нецифрени знаци ([^\d]+
) и след това друга група цифри ((\d+)
), последвано от известен брой знаци до края на низа (.*$
). ()
около втората група от цифрови знаци прави това група за прихващане, която след това можем да посочим в заместващия низ с \1
. От REGEXP_REPLACE
замества само частите от низа, които съответстват на регулярния израз, необходимо е да има регулярен израз, който съответства на цялото низ, за да го замените само с желаните данни.
Актуализация
Ако има потенциално знаци преди първия набор от цифри, трябва да промените регулярния израз на
^[^\d]*\d+[^\d]+(\d+).*$
Актуализация 2
Ако е възможно в началото да има само един набор от числа, трябва да направим съвпадението на първата част незадължително. Можем да направим това с група без прихващане:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
Това прави съвпадението на първия набор от цифри незадължително, така че ако не съществува (т.е. има само един набор от цифри), регулярният израз пак ще съвпада. Чрез използване на група без прихващане (добавяне на ?:
до началото на групата, не е необходимо да променяме заместващия низ от \1
. Актуализиран SQLFiddle