Поскольку ваш запрос в данный момент написан, предложение WHERE не даст вам никакой информации, которая может быть использована для сортировки ваших результатов. Мне нравится идея Брайана ; добавьте постоянный столбец и объедините запросы, и вы можете получить все в одном наборе результатов. Например:
SELECT 1 as rank, * FROM Items WHERE column LIKE '%foo%' AND column LIKE '%bar%'
UNION
SELECT 2 as rank, * FROM Items WHERE column LIKE '%foo%' AND column NOT LIKE '%bar%'
UNION
SELECT 2 as rank, * FROM Items WHERE column LIKE '%bar%' AND column NOT LIKE '%foo%'
ORDER BY rank
Однако, это только даст вам что-то вроде этого:
- Неупорядоченный набор всех строк, соответствующих foo и match bar
- , за которым следует (неупорядоченный набор) все строки, которые соответствуют foo или bar, но не обеим (хотя вы можете разбить это на две отдельные группы, используя другую константу в последнем операторе SELECT).
Что может быть именно тем, что вы ищете, но оно не скажет вам, какие строки соответствуют foo три раза, или отсортирует их перед строками, которые содержат только один экземпляр foo. Также все эти НРАВИТСЯ могут стать дорогими. Если вы действительно хотите отсортировать результаты по релевантности (как бы вы это ни определяли), вам лучше использовать полнотекстовый индекс. Если вы используете MS SQL Server, у него есть встроенный сервис, который будет делать это, и есть также сторонние продукты, которые будут делать то же самое.
РЕДАКТИРОВАТЬ: После просмотра всех других ответов (было только два , когда я начал свой - мне, очевидно, придется учиться думать быстрее ;-)) очевидно, что есть несколько способы сделать это, в зависимости от того, что именно вы пытаетесь достичь. Я бы посоветовал вам протестировать и сравнить решения на основе того, как они работают в вашей системе . Я не эксперт по производительности / настройке, но функции, как правило, замедляют работу, особенно если вы сортируете результаты по функциям. Оператор LIKE тоже не обязательно spry. Как разработчик, кажется естественным использовать знакомые конструкции, такие как «IF» и «CASE», но запросы, которые используют больше подхода на основе множеств, обычно имеют лучшую производительность в RDMS. Опять же, YMMV, так что лучше всего проверить, действительно ли вас беспокоит производительность.