Скажем, у меня есть таблица с именами пользователей:
Id | Name
-----------
1 | Bobby
20 | Bob
90 | Bob
100 | Joe-Bob
630 | Bobberino
820 | Bob Junior
Я хочу вернуть список совпадений n
по имени для "Боб", где в результате набора сначала содержатся точные соответствия, за которыми следуют аналогичные совпадения.
Я думал, что что-то вроде этого может работать
SELECT TOP 4 a.* FROM
(
SELECT * from Usernames WHERE Name = 'Bob'
UNION
SELECT * from Usernames WHERE Name LIKE '%Bob%'
) AS a
но есть две проблемы:
- Это неэффективный запрос, поскольку sub- select может возвращать много строк (при просмотре плана выполнения показано, что соединение происходит до вершины)
- (Почти), что более важно, точное совпадение не будет отображаться первым в результатах, так как результирующий набор выглядит упорядоченным по первичному ключу.
Я ищу запрос, который вернется (для TOP 4)
Id | Name
---------
20 | Bob
90 | Bob
(and then 2 results from the LIKE query, e.g. 1 Bobby and 100 Joe-Bob)
Возможно ли это в одном запросе?