给出以下查询:
select * from users
where first_name ilike '%foo%'
OR last_name ilike '%bar%'
OR nickname ilike '%foobar%'
返回:
first_name| last_name | nickname
----------------------------------------
Foo | ABC | abcd
Foo | DEF | efgh
Foo | BAR | ijkl
AMD | Bar | foobar
Foo | Bar | foobar2
问题:
如何首先对最相关(匹配)的值进行排序?
我的意思是大多数匹配的匹配Where .. OR
预期结果:
first_name| last_name | nickname
----------------------------------------
Foo | Bar | foobar2
Foo | BAR | ijkl
AMD | Bar | foobar
Foo | ABC | abcd
Foo | DEF | efgh
答案 0 :(得分:13)
按点击次数订购:
... ORDER BY (first_name ILIKE '%foo%')::integer
+ (last_name ILIKE '%bar%')::integer
+ (nickname ILIKE '%foobar%')::integer DESC
答案 1 :(得分:2)
你需要UTL_MATCH.edit_distance_similarity(col1,col2)(link)
select * from users
where first_name ilike '%foo%'
OR last_name ilike '%bar%'
OR nickname ilike '%foobar%'
order by UTL_MATCH.edit_distance_similarity(first_name, 'foo')
+ UTL_MATCH.edit_distance_similarity(last_name, 'bar')
+ UTL_MATCH.edit_distance_similarity(nickname, 'foobar')
UTL_MATCH.edit_distance_similarity返回相似性百分比,即
编辑:Aaah,你指定了PostGreSql,那是oracle。但是正如我已经得到的那样,或许它也许正确...... Edit3 :正如Laurenz Albe在评论中提到的那样,postgreSql中肯定没有utl_matcvh。所以你需要使用模块或他的方法。为了完整,我会留下这个答案。
Edit2 :要检查PostGreSql中的相似性,您可以使用模块fuzzystrmatch示例:
fuzzystrmatch模块提供了两个使用的功能 Soundex代码:
soundex(text)返回文本,差异(text,text)返回int
SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');