En måde (af mange) at gøre dette på:Fjern resten af strengen, der begynder ved matchen, og mål længden af den afkortede streng:
SELECT id, title
FROM book
WHERE title ILIKE '%deep%space%'
ORDER BY length(regexp_replace(title, 'deep.*space.*', '','i'));
Brug af ILIKE
i WHERE-sætningen, da det typisk er hurtigere (og gør det samme her).
Bemærk også den fjerde parameter til regexp_replace()
funktion ('i'
), for at gøre det ufølsomt over for store og små bogstaver.
Alternativer
Som på anmodning i kommentaren.
Samtidig demonstreres, hvordan man sorterer matches først (og 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'));
Du kan finde dokumentation for alt ovenstående i manualen her og her .
-> SQLfiddle demonstrerer alle.