Salah satu cara (dari banyak) untuk melakukan ini:Lepaskan sisa string yang dimulai dari kecocokan dan ukur panjang string yang terpotong:
SELECT id, title
FROM book
WHERE title ILIKE '%deep%space%'
ORDER BY length(regexp_replace(title, 'deep.*space.*', '','i'));
Menggunakan ILIKE
dalam klausa WHERE, karena itu biasanya lebih cepat (dan melakukan hal yang sama di sini).
Perhatikan juga parameter keempat ke regexp_replace()
fungsi ('i'
), untuk membuatnya tidak peka huruf besar/kecil.
Alternatif
Sesuai permintaan di komentar.
Sekaligus mendemonstrasikan cara mengurutkan kecocokan pertama (dan 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'));
Anda dapat menemukan dokumentasi untuk semua hal di atas dalam manual di sini dan di sini .
-> SQLfiddle mendemonstrasikan semuanya.