Ответ 1
Попробуйте следующим образом:
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 ;
Мне нужен SQLite-запрос, который ищет 1 поле только с использованием LIKE.
Основной пример:
SELECT name FROM table WHERE name LIKE "%John%" ORDER BY name LIMIT 10;
Проблема заключается в том, что я хочу, чтобы результат упорядочивался таким образом:
Следующий запрос достигает ожидаемого результата, но медленный:
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;
Запрос выше медленнее (или я тестировал его неправильно), чем альтернативу использования 3 отдельных запросов (один для точного соответствия, один для начала и один для содержит).
Есть ли другие альтернативы?
Попробуйте следующим образом:
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 ;
Для ваших тестов эквивалентности должно быть достаточно:
ORDER BY name = "John" DESC, name LIKE "John%" DESC
Предложения ORDER BY оцениваются слева направо.