2012-04-09 20 views
11

Necesito una consulta de SQLite que busque 1 campo solo con LIKE.SQLite LIKE & ORDER BY Consulta de coincidencia

Ejemplo básico:

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

El problema es que quiero que el resultado que se ordenó de esta manera:

  1. Si el campo es igual (por ejemplo, "John")
  2. Si el campo comienza con "Juan" (por ejemplo, "John Doe")
  3. Si el campo contiene "Juan" (por ejemplo, "Jane John Doe")

La consulta siguiente logra el resultado esperado, pero es 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 consulta anterior es más lento (o lo probé incorrectamente) que la alternativa de utilizar 3 consultas separadas (una para coincidencia exacta, uno para comienza con y uno para contiene).

¿Hay alguna otra alternativa?

Respuesta

14

Trate de esta manera:

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

debería ser suficiente para ordenar en sus pruebas de equivalencia:

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

cláusulas ORDER BY se evalúan de izquierda a derecha.