これを行う1つの方法(多くの方法):一致で始まる残りの文字列を削除し、切り捨てられた文字列の長さを測定します:
SELECT id, title
FROM book
WHERE title ILIKE '%deep%space%'
ORDER BY length(regexp_replace(title, 'deep.*space.*', '','i'));
ILIKE
の使用 WHERE句では、通常は高速であるため(ここでも同じことを行います)、
regexp_replace()
の4番目のパラメーターにも注意してください。 関数('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'));
上記のすべてのドキュメントは、マニュアルこちらにあります。 a> および
-> SQLfiddle すべてを示しています。