加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 如何从两个查询的并集中选择最上面的n,其中生成的顺序需

发布时间:2020-12-12 08:55:45 所属栏目:MsSql教程 来源:网络整理
导读:假设我有一个用户名的表: Id | Name-----------1 | Bobby20 | Bob90 | Bob100 | Joe-Bob630 | Bobberino820 | Bob Junior 我想要返回名为“Bob”的n个匹配的列表,其中最终的集合首先包含完全匹配,然后是类似的匹配. 我以为这样的事情可能会起作用 SELECT TOP
假设我有一个用户名的表:
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读