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