Sql server 按值列表对查询结果排序

Sql server 按值列表对查询结果排序,sql-server,Sql Server,我正在处理一个sql查询,该查询将值列表作为参数传递,如 select * from ProductGroups where GroupID in (24,12,7,14,65) 此列表由数据库中使用的关系构成,必须按此顺序保存 我想按此列表排序结果。我只需要第一个结果,但在本例中可能是GroupId为7的结果 我不能这样问 order by (24,12,7,14,65).indexOf(GroupId) 有人知道怎么做吗 其他信息: 构建联接并在mssql查询编辑器中运行,但是 由于向

我正在处理一个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发送查询的软件的限制,我必须将其作为一个参数传递给一些内部查询生成器,因此为“24,12,7,14,65”。我不知道这个列表中会有多少数字,可能是2,可能是20

使用临时表进行连接,在临时表中,您有要作为行筛选的值。向其中添加一列,该列的顺序与第二列相同,并按其排序

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

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

您还可以根据以下情况订购:

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

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


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

可以将参数作为xml传递,然后动态获取值吗?此值列表的问题是,它在我的应用程序中的不同位置使用。在将其作为参数传递之前,我可以对其进行一些小的更改,比如将“,”更改为“”。开发工具(WebDev12)使用某种字符串替换来构建查询,因此{Parameter}将被我提供的值替换。与使用临时表相比,这似乎会对性能造成很大影响。打破一个分隔的字符串并不难,网上有很多代码可以做到这一点。谢谢!我不是sql专家,但我会研究一下。我要寻找的答案就是——实现一个未知值和未知大小的列表需要最少的工作,它非常适合排序小的动态列表,而不需要临时、连接和案例的跳跃。做得好!伟大的为了简化操作,从SQL Server 2018开始,您可以执行以下操作:插入@rank(number)值(24)、(12)、(7)、(14)、(65)。通过这种方式,您可以节省一些插入,并更好地管理更大的值列表;)
select * 
from ProductGroups
where GroupID in (24,12,7,14,65)
order by charindex(
             ','+cast(GroupID as varchar)+',' ,
             ','+'24,12,7,14,65'+',')