按值列表排序查询结果

时间:2009-12-02 09:42:34

标签: 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查询编辑器中运行并运行它,但是......

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

4 个答案:

答案 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)

使用临时表进行连接,其中您具有要按行筛选的值。向其中添加一个具有所需顺序的列作为第二列,并按其排序。