8

假设我分解了在搜索中传递的字符串。示例:“如果有一只狗” “如果有一只狗”(愚蠢的美国人)。

我们基于“”爆炸所以结果......

if
there
were
a
dog

现在我想运行一个SQL select * from table_name query where column_name like '%something%' or column_name like '%somethingelse%'...

我正在尝试确定如何搜索表并按包含最多匹配项的行进行排序。(即,如果第45行包含上述拆分项目中的4 个,而第21行仅包含2 个,则第45行应显示在结果的顶部)。

这将是一个原始的“搜索相关性”逻辑。SQL 中是否有这种检索的特定术语?

建议?

4

2 回答 2

7

只需将比较放在order by子句中,使用case语句将它们转换为 0/1,然后将它们相加:

select *
from table_name query
where column_name like '%something%' or column_name like '%somethingelse%'
order by ((case when column_name like '%something%' then 1 else 0 end) +
          (case when column_name like '%somethingelse%' then 1 else 0 end)
          . . .
         ) desc

我倾向于将查询写为:

select (Match1+Match2+. . .) as NumMatches, <rest of columns>
from (select t.*,
             (case when column_name like '%something%' then 1 else 0 end) as Match1,
             . . .
      from tablename
     ) t
order by NumMatches desc
于 2013-02-07T19:40:17.967 回答
1

这是@Gordon 出色答案的变体:

SELECT FieldToSearch, 
  CASE WHEN ' ' + FieldToSearch + ' ' like '% if %' then 1 else 0 end
      + CASE WHEN ' ' + FieldToSearch + ' ' like '% there %' then 1 else 0 end 
      + CASE WHEN ' ' + FieldToSearch + ' ' like '% was %' then 1 else 0 end
      + CASE WHEN ' ' + FieldToSearch + ' ' like '% a %' then 1 else 0 end
      + CASE WHEN ' ' + FieldToSearch + ' ' like '% dog %' then 1 else 0 end matches
FROM YourTable
ORDER BY matches DESC

这是小提琴

祝你好运!

于 2013-02-07T19:51:09.907 回答