鉴于以下查询:
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
按命中数排序:
... ORDER BY (first_name ILIKE '%foo%')::integer
+ (last_name ILIKE '%bar%')::integer
+ (nickname ILIKE '%foobar%')::integer DESC
你需要UTL_MATCH.edit_distance_similarity(col1,col2)(链接)
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返回相似性百分比,即
- 超人=超人=> 100 [%]
- 超人= supermon => 88 [%]
编辑: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');
按命中数排序:
... ORDER BY (first_name ILIKE '%foo%')::integer
+ (last_name ILIKE '%bar%')::integer
+ (nickname ILIKE '%foobar%')::integer DESC
你需要UTL_MATCH.edit_distance_similarity(col1,col2)(链接)
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返回相似性百分比,即
- 超人=超人=> 100 [%]
- 超人= supermon => 88 [%]
编辑: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');