Můžete použít REGEXP_REPLACE
:
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Výstup
7654321
Tento regulární výraz hledá řetězec začínající určitým počtem číslic (^\d+
) následované několika nečíslicovými znaky ([^\d]+
) a poté další skupina číslic ((\d+)
) následovaný určitým počtem znaků až do konce řetězce (.*$
). ()
kolem druhé skupiny číslicových znaků se jedná o zachycovací skupinu, na kterou pak můžeme odkazovat v náhradním řetězci pomocí \1
. Od REGEXP_REPLACE
nahrazuje pouze části řetězce, které odpovídají regulárnímu výrazu, je nutné mít regulární výraz, který odpovídá celku řetězec, abyste jej nahradili pouze požadovanými daty.
Aktualizovat
Pokud jsou před první sadou číslic potenciálně znaky, měli byste změnit regulární výraz na
^[^\d]*\d+[^\d]+(\d+).*$
Aktualizace 2
Je-li možné, že na začátku je pouze jedna sada čísel, musíme povolit párování první části. Můžeme to udělat se skupinou, která nezachytává:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
Díky tomu je shoda na první sadě číslic volitelná, takže pokud neexistuje (tj. existuje pouze jedna sada číslic), regulární výraz bude stále odpovídat. Použitím nezachycující skupiny (přidáním ?:
na začátek skupiny, nemusíme měnit nahrazující řetězec z \1
. Aktualizováno SQLFiddle