【问题标题】:Ordering query result by list of values按值列表排序查询结果
【发布时间】:2009-12-02 09:42:34
【问题描述】:

我正在处理一个将值列表作为参数传递的 sql 查询,例如

select * 
from ProductGroups
where GroupID in (24,12,7,14,65)

此列表由数据库中使用的关系构成,必须按此顺序保存。

我想按此列表对结果进行排序。我只需要第一个结果,但在这种情况下它可能是 GroupId 7 的结果。

我不能像这样查询

order by (24,12,7,14,65).indexOf(GroupId)

有人知道怎么做吗?

其他信息:
构建一个连接可以在 mssql 查询编辑器中运行并运行它,但是......

由于将查询发送到 mssql 的软件的限制,我必须将其作为 1 个参数传递给一些内部查询生成器,即“24,12,7,14,65”。而且我不知道这个列表中会有多少个数字,可能是 2,可能是 20。

【问题讨论】:

  • 能否将参数作为xml传入,然后动态获取值?
  • 这个值列表的问题在于它在我的应用程序的不同位置使用。在将其作为参数传递之前,我可以对其进行一些小的更改,例如将“,”更改为“”。开发工具 (WebDev12) 使用某种字符串替换来构建查询,因此 {Parameter} 将替换为我提供的值。

标签: sql-server


【解决方案1】:

您也可以按 CASE 订购:

select * 
from ProductGroups
where GroupID in (24,12,7,14,65)
order by case GroupId 
    when 7 then 1 -- First in ordering
    when 14 then 2 -- Second
    else 3
end

【讨论】:

    【解决方案2】:

    使用带有标识列的表变量或临时表,输入您的值并加入其中,例如

    declare @rank table (
        ordering int identity(1,1)
        , number int    
        )
    
    insert into @rank values (24)
    insert into @rank values (12)
    insert into @rank values (7)
    insert into @rank values (14)
    insert into @rank values (65)
    
    select  pg.*
    from    ProductGroups pg
    left outer join 
        @rank r
    on  pg.GroupId = r.number 
    order by 
        r.ordering
    

    【讨论】:

    • 太棒了!为了让生活更轻松,从 SQL Server 2018 开始,您可以执行以下操作:INSERT INTO @rank(number) VALUES (24)、(12)、(7)、(14)、(65)。这样,您可以节省一些 INSERT 并更好地管理更大的值列表;)
    【解决方案3】:

    我想我可能已经找到了一个可能的解决方案(但它很难看):

    select * 
    from ProductGroups
    where GroupID in (24,12,7,14,65)
    order by charindex(
                 ','+cast(GroupID as varchar)+',' ,
                 ','+'24,12,7,14,65'+',')
    

    这将按行在列表中出现的位置对行进行排序。我也可以传递我需要的字符串。

    【讨论】:

    • 与使用临时表相比,这对我来说似乎是一个性能猪。打破分隔字符串并不难,网上有很多代码可以做到。
    • 谢谢!我不是 sql 专家,但我会研究一下。
    • 正是我正在寻找的答案 - 需要最少的工作来实现未知值和未知大小的列表
    • 谢谢,它非常适合订购小型动态列表,而无需临时、连接和案例的跳跃。干得好!
    【解决方案4】:

    与一个临时表进行连接,在该表中,您有要作为行过滤的值。向其中添加一个具有您想要的顺序作为第二列的列,并按它排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多