问题 首先按大多数匹配的记录排序


鉴于以下查询:

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

3155
2018-04-16 08:05


起源



答案:


按命中数排序:

... ORDER BY (first_name ILIKE '%foo%')::integer 
           + (last_name  ILIKE '%bar%')::integer
           + (nickname   ILIKE '%foobar%')::integer DESC

13
2018-04-16 08:09





你需要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');

2
2018-04-16 08:13



没有 UTL_MATCH 在PostgreSQL中。 - Laurenz Albe
我根据您对@LaurenzAlbe的评论扩展了我的答案,但在提到模块fuzzystrmatch的时候就把它留了下来。 - Chrᴉz


答案:


按命中数排序:

... ORDER BY (first_name ILIKE '%foo%')::integer 
           + (last_name  ILIKE '%bar%')::integer
           + (nickname   ILIKE '%foobar%')::integer DESC

13
2018-04-16 08:09





你需要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');

2
2018-04-16 08:13



没有 UTL_MATCH 在PostgreSQL中。 - Laurenz Albe
我根据您对@LaurenzAlbe的评论扩展了我的答案,但在提到模块fuzzystrmatch的时候就把它留了下来。 - Chrᴉz