Anda dapat menggunakan REGEXP_REPLACE
:
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Keluaran
7654321
Regexp ini mencari string yang dimulai dengan sejumlah digit (^\d+
) diikuti oleh beberapa karakter non-digit ([^\d]+
) dan kemudian grup digit lainnya ((\d+)
) diikuti oleh beberapa karakter hingga akhir string (.*$
). ()
di sekitar grup karakter digit kedua menjadikannya grup penangkap, yang kemudian dapat kita rujuk dalam string pengganti dengan \1
. Sejak REGEXP_REPLACE
hanya mengganti bagian dari string yang cocok dengan ekspresi reguler, perlu memiliki ekspresi reguler yang cocok dengan keseluruhan string untuk menggantinya hanya dengan data yang diinginkan.
Perbarui
Jika ada kemungkinan karakter sebelum kumpulan digit pertama, Anda harus mengubah ekspresi reguler menjadi
^[^\d]*\d+[^\d]+(\d+).*$
Perbarui 2
Jika mungkin hanya ada satu set angka di awal, kita harus membuat pencocokan bagian pertama opsional. Kita dapat melakukannya dengan grup yang tidak menangkap:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
Ini membuat kecocokan pada set digit pertama opsional sehingga jika tidak ada (yaitu hanya ada satu set digit) regex akan tetap cocok. Dengan menggunakan grup yang tidak menangkap (menambahkan ?:
ke awal grup, kita tidak perlu mengubah string pengganti dari \1
. SQLFiddle
telah diperbarui