我有一个类似下面的查询,我希望以与“in”函数中指定的 id 相同的顺序返回记录。
SELECT * FROM table 1 where id in(12,6,4,3,13)
我可以单独使用 sql 来做到这一点,还是需要编写自己的排序函数。
我有一个类似下面的查询,我希望以与“in”函数中指定的 id 相同的顺序返回记录。
SELECT * FROM table 1 where id in(12,6,4,3,13)
我可以单独使用 sql 来做到这一点,还是需要编写自己的排序函数。
使用您的 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
您可以使用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