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

时间:2018-04-16 08:05:21

标签: sql postgresql

给出以下查询:

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

2 个答案:

答案 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返回相似性百分比,即

  • 超人=超人=> 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');