2012-04-09 12 views
11

Ho bisogno di una query SQLite che cerchi solo 1 campo utilizzando LIKE.SQLite LIKE e ORDER BY Query di corrispondenza

Esempio di base:

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

Il problema è che voglio il risultato da ordinare in questo modo:

  1. Se il campo è uguale (ad esempio, "John")
  2. Se il campo inizia con "John" (ad esempio, "John Doe")
  3. Se il campo contiene "John" (ad esempio, "Jane John Doe")
012.

La seguente query raggiunge il risultato atteso, ma è lento:

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; 

La query sopra è più lento (o ho testato erroneamente) che l'alternativa di usare 3 query separate (una per la corrispondenza esatta, uno per inizia con e uno per contiene).

Ci sono altre alternative?

risposta

14

Prova in questo modo:

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

dovrebbe essere sufficiente per ordinare il vostro test di equivalenza:

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

clausole ORDER BY vengono valutati da sinistra a destra.