2012-04-09 13 views
11

Potrzebuję zapytania SQLite, które przeszukuje 1 pole tylko używając LIKE.SQLite LIKE & ORDER BY Zapytanie o dopasowanie

Podstawowe przykład:

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

Problem polega na tym, że chcę wynikiem zamawiane w ten sposób:

  1. Jeśli pole jest równe (np "Jan")
  2. Jeśli pole zaczyna się od "John" (np. "John Doe")
  3. Jeśli pole zawiera "John" (np. "Jane John Doe")

następującego zapytania osiąga się oczekiwany wynik, lecz słaba:

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; 

powyżej Zapytanie jest mniejsza (lub I badane nieprawidłowo) niż alternatywy przy użyciu 3 oddzielnych zapytania (jeden dla dokładnego dopasowania, jeden dla zaczyna się od i jeden zawiera).

Czy są jeszcze jakieś alternatywy?

Odpowiedz

14

Spróbuj w ten sposób:

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

To powinno wystarczyć, aby zamówić od wyników badań równoważności:

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

klauzul ORDER BY są obliczane od lewej do prawej.