Een (van de vele) manier om dit te doen:verwijder de rest van de string vanaf de match en meet de lengte van de afgekapte string:
SELECT id, title
FROM book
WHERE title ILIKE '%deep%space%'
ORDER BY length(regexp_replace(title, 'deep.*space.*', '','i'));
ILIKE
gebruiken in de WHERE-component, aangezien dat doorgaans sneller is (en hier hetzelfde doet).
Let ook op de vierde parameter van de regexp_replace()
functie ('i'
), om het hoofdletterongevoelig te maken.
Alternatieven
Volgens verzoek in de opmerking.
Tegelijkertijd demonstreren hoe overeenkomsten te sorteren eerst (en 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'));
U kunt documentatie voor al het bovenstaande vinden in de handleiding hier en hier .
-> SQLfiddle alles demonstreren.