2012-04-09 51 views
11

我需要一个SQLite查询,只使用LIKE搜索1个字段。SQLite LIKE&ORDER BY匹配查询

基本例如:

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

的问题是,我想要的结果,以这种方式进行排序:

  1. 如果该字段是相等的(例如,“约翰”)
  2. 如果该字段以“John”开头(例如“John Doe”)
  3. 如果该字段包含“John”(例如“Jane John Doe”)

以下查询达到了预期的结果,但是慢:

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; 

上面的查询是较慢的(或I测试它不正确地)比使用3个独立的查询(一个针对完全匹配,一个用于的替代以及包含一个)。

有没有其他的选择?

回答

14

尝试这种方式:

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 ; 
6

应该足以订购您等价测试:从左至右

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

ORDER BY子句进行评估。