Един от начините (от много) да направите това:Премахнете останалата част от низа, започващ от съвпадението, и измерете дължината на съкратения низ:
SELECT id, title
FROM book
WHERE title ILIKE '%deep%space%'
ORDER BY length(regexp_replace(title, 'deep.*space.*', '','i'));
Използване на ILIKE
в клаузата WHERE, тъй като това обикновено е по-бързо (и прави същото тук).
Обърнете внимание и на четвъртия параметър към regexp_replace()
функция ('i'
), за да го направи нечувствителен към главни и малки букви.
Алтернативи
Съгласно заявката в коментара.
В същото време демонстрира как да сортирате съвпаденията първо (и 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'));
Можете да намерите документация за всичко по-горе в ръководството тук и тук .
-> SQLfiddle демонстрира всички.