PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Nhận trận đấu thứ hai từ kết quả regexp_matches

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tệp postgres db - tệp nào đại diện cho bảng / chỉ mục cụ thể?

  2. Không thể sử dụng người dùng postgres trong cơ sở dữ liệu mới cho rails 3 trên máy chủ ubuntu 10.04

  3. Làm cách nào để chỉ định cơ sở dữ liệu đang hoạt động hiện tại cho tập lệnh khởi tạo của vùng chứa postgres docker?

  4. Làm thế nào để có được số lượt tham gia INNER và số lượng của tất cả các mục?

  5. PostgreSQL kiểm tra xem trường dấu thời gian có trống không