2

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

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

我可以单独使用 sql 来做到这一点,还是需要编写自己的排序函数。

4

2 回答 2

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
于 2013-05-05T18:13:25.980 回答
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
于 2013-05-05T16:29:36.130 回答