Sql 先按最匹配的记录排序

Sql 先按最匹配的记录排序,sql,postgresql,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 | DE

给出以下查询:

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
问题:

 first_name| last_name   |  nickname
----------------------------------------
  Foo      | Bar         |   foobar2
  Foo      | BAR         |   ijkl
  AMD      | Bar         |   foobar
  Foo      | ABC         |   abcd
  Foo      | DEF         |   efgh
如何首先对最相关(匹配)的值进行排序? 我指的是在
Where.中匹配多个模式的most匹配。。或

预期结果:

 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\u匹配。编辑距离\u相似性(col1,col2)()

UTL_MATCH.edit_distance_similarity返回相似性的百分比,即

  • 超人=超人=>100[%]
  • 超人=超人=>88[%]
编辑:啊,你指定了PostGreSql,那是oracle。但我已经有了一个类似的想法,不管怎样,这也许是对的Edit3:正如Laurenz Albe在评论中提到的,postgreSql中绝对没有utl_matcvh。所以你需要使用模块或他的方法。为了完整起见,我将留下这个答案

Edit2:要检查PostGreSql中的相似性,可以使用模块示例:

fuzzystrmatch模块提供了两个用于处理 Soundex代码:

soundex(文本)返回文本,差分(文本,文本)返回int


PostgreSQL中没有
UTL_匹配
。我根据您的评论@LaurenzAlbe扩展了我的答案,但在提到fuzzystrmatch模块时留下了它。
SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');