2012-04-09 3 views
11

J'ai besoin d'une requête SQLite qui recherche 1 champ uniquement en utilisant LIKE.SQLite LIKE & ORDER BY Requête de correspondance

exemple de base:

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

Le problème est que je veux que le résultat à commander de cette manière:

  1. Si le champ est égal (par exemple, "John")
  2. Si le champ commence par "John" (par exemple "John Doe")
  3. Si le champ contient "John" (par exemple "Jane John Doe")

La requête suivante permet d'obtenir le résultat attendu, mais il est lent:

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 requête ci-dessus est plus lente (ou je l'ai testé à tort) que la possibilité d'utiliser 3 requêtes distinctes (une pour correspondance exacte, un pour commence par et un pour contient).

Y a-t-il d'autres alternatives?

Répondre

14

Essayez de cette façon:

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

Il devrait suffire à commander sur vos tests d'équivalence:

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

clauses ORDER BY sont évalués de gauche à droite.