SQLite LIKE& ORDER BY匹配查询

时间:2012-04-09 08:01:43

标签: sql sqlite

我需要一个仅使用LIKE搜索1个字段的SQLite查询。

基本示例:

SELECT name FROM table WHERE name LIKE "%John%" ORDER BY name LIMIT 10;

问题是我希望以这种方式对结果进行排序:

  1. 如果字段相等(例如“John”)
  2. 如果字段以“John”开头(例如“John Doe”)
  3. 如果该字段包含“John”(例如“Jane John Doe”)
  4. 以下查询实现了预期结果,但速度很慢:

    SELECT name FROM table WHERE name LIKE "%John%" ORDER BY CASE WHEN name = "John" 
    THEN 1 ELSE 2 END, CASE WHEN name LIKE "John%" THEN 1 ELSE 2 END, name LIMIT 10;
    

    上面的查询比使用3个单独的查询(一个用于完全匹配,一个用于开始,一个用于包含)的替代方法更慢(或我测试不正确)。

    还有其他选择吗?

2 个答案:

答案 0 :(得分:16)

尝试这种方式:

SELECT name 
FROM table 
WHERE name LIKE "%John%" 
ORDER BY (CASE WHEN name = "John" THEN 1 WHEN name LIKE "John%" THEN 2 ELSE 3 END),name LIMIT 10 ;

答案 1 :(得分:7)

在等效性测试中订购应该足够了:

ORDER BY name = "John" DESC, name LIKE "John%" DESC

ORDER BY子句从左到右进行评估。