假设我有一个用户名的表:
Id | Name ----------- 1 | Bobby 20 | Bob 90 | Bob 100 | Joe-Bob 630 | Bobberino 820 | Bob Junior
我想要返回名为“Bob”的n个匹配的列表,其中最终的集合首先包含完全匹配,然后是类似的匹配.
我以为这样的事情可能会起作用
SELECT TOP 4 a.* FROM ( SELECT * from Usernames WHERE Name = 'Bob' UNION SELECT * from Usernames WHERE Name LIKE '%Bob%' ) AS a
但有两个问题:
>这是一个无效的查询,因为子选择可以返回许多行(看执行计划显示在顶部之前发生的连接)
>(几乎)更重要的是,完全匹配不会首先出现在结果中,因为结果集看起来按主键排序.
我正在寻找将返回的查询(对于TOP 4)
Id | Name --------- 20 | Bob 90 | Bob (and then 2 results from the LIKE query,e.g. 1 Bobby and 100 Joe-Bob)
这是否可能在单个查询中?
解决方法
您可以使用案例将准确的匹配项放在顶部:
select top 4 * from Usernames where Name like '%Bob%' order by case when Name = 'Bob' then 1 else 2 end
select top 4 * from ( select 1 as SortOrder,* from Usernames where Name = 'Bob' union all select 2,* from Usernames where Name like '%Bob%' and Name <> 'Bob' and 4 > ( select count(*) from Usernames where Name = 'Bob' ) ) as SubqueryAlias order by SortOrder