2013-05-05 36 views
1

我有一个类似于下面的查询,我希望记录以与在'in'函数中指定的id相同的顺序返回。根据函数中的SQL内部的顺序对列进行排序

SELECT * FROM table 1 where id in(12,6,4,3,13) 

我可以单独使用sql吗?还是我需要编写自己的排序函数?

+0

插入将它们转换为具有两列的临时表或表值参数。 'id'和'SortOrder'并加入而不是使用'in'。然后你可以在第二栏订购。 – 2013-05-05 16:40:02

回答

2

可以使用CASE来记录自定义排序,

ORDER BY CASE WHEN ID = 12 THEN 1 
       WHEN ID = 6 THEN 2 
       WHEN ID = 4 THEN 3 
       WHEN ID = 3 THEN 4 
       WHEN ID = 13 THEN 5 
       ELSE 6 
     END, ID 
+0

多数民众赞成现在罚款..但我有我自己的查询,如果“列表”不是固定的,有没有什么办法,我们可以根据列表进行排序? – 2013-05-05 16:31:57

+0

是可扩展的解决方案吗?说像100-10k ID? – thunderbird 2013-05-05 16:33:10

+0

@AmitSingh然后您可以为此创建动态SQL,或者在应用程序级别创建一条生成条件排序的语句。 – 2013-05-05 16:33:19

3

创建一个表,你的ID,然后用另一个身份列加入到表,订货。

大概如果你有10K的ID,他们不会被手动输入,因此可以建立排序/连接表以不同的方式。还应该更加效率比使用大in

create table #tempID(idSort int identity(1,1), id int) 
insert into #tempID(id) 
select 12 union all 
select 6 union all 
select 4 union all 
select 3 union all 
select 13 

select * from table t1 
    inner join #tempID t2 
     on t1.id = t2.id 
order by t2.idSort 

要动态创建排序表,你需要这个功能(或类似):

create FUNCTION [dbo].[comma_sep_var_intSort] (@list nvarchar(MAX)) 
    RETURNS @tbl TABLE (idSort int identity(1,1), id int NOT NULL 
) AS 
BEGIN 
    DECLARE @pos  int, 
      @nextpos int, 
      @valuelen int 

    SELECT @pos = 0, @nextpos = 1 

    WHILE @nextpos > 0 
    BEGIN 
     SELECT @nextpos = charindex(',', @list, @pos + 1) 
     SELECT @valuelen = CASE WHEN @nextpos > 0 
           THEN @nextpos 
           ELSE len(@list) + 1 
         END - @pos - 1 
     INSERT @tbl (id) 
     VALUES (cast(substring(@list, @pos + 1, @valuelen) as int)) 
     SELECT @pos = @nextpos 
    END 
    RETURN 
END 

然后加入这样的:

declare @idList varchar(max) 

set @idLIst = '12,6,4,3,13' 

    select * from table t1 
     inner join [dbo].[comma_sep_var_int](@idList) t2 
      on t1.id = t2.id 
    order by t2.idSort 
+0

+1使其接近动态 – 2013-05-06 03:58:19

+0

如果你想要它动态的,你可能需要一个函数。 – dantibb 2013-05-06 11:41:32

相关问题