Bạn có thể sử dụng REGEXP_REPLACE
:
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Đầu ra
7654321
Regexp này tìm kiếm một chuỗi bắt đầu bằng một số chữ số (^\d+
) theo sau là một số ký tự không phải chữ số ([^\d]+
) và sau đó là một nhóm chữ số khác ((\d+)
) theo sau là một số ký tự cho đến cuối chuỗi (.*$
). ()
xung quanh nhóm ký tự chữ số thứ hai tạo thành một nhóm bắt, sau đó chúng ta có thể tham chiếu đến trong chuỗi thay thế bằng \1
. Kể từ REGEXP_REPLACE
chỉ thay thế các phần của chuỗi khớp với regex, cần phải có regex khớp với toàn bộ để thay thế nó bằng chỉ dữ liệu mong muốn.
Cập nhật
Nếu có khả năng có các ký tự trước bộ chữ số đầu tiên, bạn nên thay đổi regex thành
^[^\d]*\d+[^\d]+(\d+).*$
Cập nhật 2
Nếu có thể chỉ có một bộ số ở đầu, chúng ta phải làm cho phần đầu tiên là tùy chọn. Chúng tôi có thể làm điều đó với một nhóm không bắt:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
Điều này làm cho đối sánh trên tập hợp các chữ số đầu tiên là tùy chọn để nếu nó không tồn tại (tức là chỉ có một tập hợp các chữ số) thì regex sẽ vẫn khớp. Bằng cách sử dụng nhóm không chụp (thêm ?:
đến đầu nhóm, chúng ta không cần thay đổi chuỗi thay thế từ \1
. Đã cập nhật SQLFiddle