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

Postgres regex sự cố

Bạn không cần phải thoát - bên trong các lớp ký tự khi bạn đặt nó ở vị trí đầu tiên hoặc cuối cùng, vì nó không thể bị đọc nhầm thành phạm vi theo cách đó:

[\- ] -> [- ]
[\d\- ] -> [\d -]

Theo cách bạn có giới hạn trên 10 cuối cùng là vô ích.
Thêm $ ở cuối để không cho phép các ký tự ở cuối.
Hoặc \D để không cho phép chữ số ở cuối (nhưng yêu cầu không phải chữ số).
Hoặc ($|\D) để kết thúc chuỗi ở đó hoặc có một số theo sau không phải chữ số.

Kết hợp với nhau:

SELECT '+79637434199' ~ '^(8|\+7)[ -]?(\(?\d{3}\)?[ -]?)[\d -]{7,10}($|\D)'

Nếu không thì biểu thức của bạn vẫn ổn và nó hoạt động với tôi trên PostgreSQL 9.1.4. Nó sẽ không tạo ra bất kỳ sự khác biệt nào cho dù bạn sử dụng nó trong WHERE mệnh đề hoặc trong một SELECT danh sách - trừ khi bạn đang gặp lỗi với một số phiên bản cũ (như @kgrittn được đề xuất trong nhận xét).

Nếu tôi thêm vào trước chuỗi ký tự bằng E , Tôi có thể kích hoạt thông báo lỗi mà bạn nhận được. Điều này không thể giải thích sự cố của bạn, bởi vì bạn đã nói rằng biểu thức hoạt động tốt dưới dạng SELECT mặt hàng.

Nhưng, như Sherlock Holmes được trích dẫn, "khi bạn đã loại trừ điều không thể, thì bất cứ điều gì còn lại, dù không thể xảy ra, cũng phải là sự thật."

Có thể bạn đã chạy một thử nghiệm với standard_conforming_strings = on và cái còn lại với standard_conforming_strings = off - đây là cách diễn giải mặc định của các ký tự chuỗi trong các phiên bản cũ hơn trước 9.1. Có thể với hai máy khách khác nhau (có cài đặt khác nhau).

Đọc thêm trong chương Hằng chuỗi với C-style Escapes trong sách hướng dẫn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 cách liệt kê tất cả các trình kích hoạt trong cơ sở dữ liệu PostgreSQL

  2. Xóa một giá trị không phải duy nhất khỏi một mảng

  3. Cách search_path ảnh hưởng đến độ phân giải của mã định danh và lược đồ hiện tại

  4. findById () cung cấp Không tìm thấy Id thuộc tính

  5. Postgresql thay đổi loại cột từ int thành UUID