Un modo (tra tanti) per farlo:rimuovi il resto della stringa che inizia alla corrispondenza e misura la lunghezza della stringa troncata:
SELECT id, title
FROM book
WHERE title ILIKE '%deep%space%'
ORDER BY length(regexp_replace(title, 'deep.*space.*', '','i'));
Usando ILIKE
nella clausola WHERE, poiché in genere è più veloce (e fa lo stesso qui).
Notare anche il quarto parametro per regexp_replace()
funzione ('i'
), per non fare distinzione tra maiuscole e minuscole.
Alternative
Come da richiesta nel commento.
Allo stesso tempo dimostro come ordinare corrispondenze first (e 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'));
Puoi trovare la documentazione per tutto quanto sopra nel manuale qui e qui .
-> SQLfiddle dimostrando tutto.