Sql server 按值列表对查询结果排序
我正在处理一个sql查询,该查询将值列表作为参数传递,如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查询编辑器中运行,但是 由于向
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'+',')