我正在处理一个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。
答案 0 :(得分:11)
您也可以通过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
答案 1 :(得分:7)
使用带有标识列的表变量或临时表,输入您的值并加入其中,例如
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
答案 2 :(得分:4)
我想我可能找到了一个可能的解决方案(但它很难看):
select *
from ProductGroups
where GroupID in (24,12,7,14,65)
order by charindex(
','+cast(GroupID as varchar)+',' ,
','+'24,12,7,14,65'+',')
这将按行列表中的位置对行进行排序。我也可以像我需要的那样传递字符串。
答案 3 :(得分:2)
使用临时表进行连接,其中您具有要按行筛选的值。向其中添加一个具有所需顺序的列作为第二列,并按其排序。