Jeden způsob (z mnoha), jak to udělat:Odstraňte zbytek řetězce začínajícího na shodě a změřte délku zkráceného řetězce:
SELECT id, title
FROM book
WHERE title ILIKE '%deep%space%'
ORDER BY length(regexp_replace(title, 'deep.*space.*', '','i'));
Pomocí ILIKE
v klauzuli WHERE, protože to je obvykle rychlejší (a dělá totéž zde).
Všimněte si také čtvrtého parametru regexp_replace()
funkce ('i'
), aby se nerozlišovala malá a velká písmena.
Alternativy
Podle požadavku v komentáři.
Zároveň ukázka toho, jak seřadit shody první (a 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'));
Dokumentaci pro všechny výše uvedené naleznete v příručce zde a zde .
-> SQLfiddle předvedení všech.