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

Làm thế nào để lấy vị trí của đối sánh regexp trong chuỗi trong PostgreSQL?

Một cách (trong số nhiều cách) để làm điều này:Loại bỏ phần còn lại của chuỗi bắt đầu từ trận đấu và đo độ dài của chuỗi bị cắt ngắn:

SELECT id, title
FROM   book
WHERE  title ILIKE '%deep%space%'
ORDER  BY length(regexp_replace(title, 'deep.*space.*', '','i'));

Sử dụng ILIKE trong mệnh đề WHERE, vì điều đó thường nhanh hơn (và thực hiện tương tự ở đây).
Cũng lưu ý tham số thứ tư cho regexp_replace() hàm ('i' ), để phân biệt chữ hoa chữ thường.

Lựa chọn thay thế

Theo yêu cầu trong nhận xét.
Đồng thời trình bày cách sắp xếp đối sánh đầu tiên (và NULLS LAST ).

SELECT id, title
      ,substring(title FROM '(?i)(^.*)deep.*space.*') AS sub1
      ,length(substring(title FROM '(?i)(^.*)deep.*space.*')) AS pos1

      ,substring(title FROM '(?i)^.*(?=deep.*space.*)') AS sub2
      ,length(substring(title FROM '(?i)^.*(?=deep.*space.*)')) AS pos2

      ,substring(title FROM '(?i)^.*(deep.*space.*)') AS sub3
      ,position((substring(title FROM '(?i)^.*(deep.*space.*)')) IN title) AS p3

      ,regexp_replace(title, 'deep.*space.*', '','i') AS reg4
      ,length(regexp_replace(title, 'deep.*space.*', '','i')) AS pos4
FROM   book
ORDER  BY title ILIKE '%deep%space%' DESC NULLS LAST
         ,length(regexp_replace(title, 'deep.*space.*', '','i'));

Bạn có thể tìm thấy tài liệu hướng dẫn cho tất cả những điều trên trong đây tại đây .

-> SQLfiddle thể hiện tất cả.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn psycopg2 chưa được lưu

  2. Không thể bỏ vai trò được cấp để kết nối cơ sở dữ liệu

  3. Cập nhật postgres từ tham gia bên trái

  4. ScalikeJDBC:Nhóm kết nối chưa được khởi tạo. (Tên:'mặc định)

  5. Tìm nhanh người dùng ở gần bằng PostGIS