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 và tại đây .
-> SQLfiddle thể hiện tất cả.