根据函数中SQL内部的顺序对列进行排序

时间:2013-05-05 16:27:18

标签: sql sql-server tsql

我有一个类似下面的查询,我希望以与'in'函数中指定的id相同的顺序返回记录。

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

我可以单独使用sql,还是需要编写自己的排序功能。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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