根据匹配位置动态地按列排序结果

5

我正在从一个表中选择数据,其中三个列之一与给定的搜索字符串匹配:

SELECT * 
FROM CARS
WHERE MODEL LIKE searchString
OR MANUFACTURER LIKE searchString
OR DESCRIPTION LIKE searchString

但是,我需要根据列权重来根据匹配位置对结果进行排序。即,如果在MODEL列中找到匹配项,则该行应出现在结果中的位置高于如果在MANUFACTURER列中找到匹配项。 权重为1-MODEL 2-MANUFACTURER 3-DESCRIPTION。非常感谢您的所有帮助,谢谢!
1个回答

4

Oracle的全文检索(FTS)功能 - Oracle Text - 会更快,并根据其算法提供排名分数...

SELECT c.*,
            CASE 
                WHEN c.model LIKE searchstring THEN 1
                WHEN c.manufacturer LIKE searchstring THEN 2
                WHEN c.description LIKE searchstring THEN 3
            END AS match_rank
    FROM CARS c
  WHERE c.model LIKE searchstring
        OR c.manufacturer LIKE searchstring
        OR c.description LIKE searchstring
ORDER BY match_rank 

但你没有提到如果两个或更多列匹配时如何处理排名...

排名应该在找到匹配项后停止。这是否只需要在每个“WHEN”语句的末尾添加一个“END”就可以了? - essembee
刚刚意识到一旦条件被判定为真,case语句将返回结果而不会进一步评估条件。所以这很完美,干杯! - essembee
好的解决方案,但要在大表上检查性能。如果返回所有内容,则不应有太大差异,只需排序成本。但是,如果返回TOP(x)子集,则整个表需要首先按匹配进行排序。请检查执行计划是否符合您的要求。 - Dave Sumter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接