我有一个类似于下面的查询,我希望记录以与在'in'函数中指定的id相同的顺序返回。根据函数中的SQL内部的顺序对列进行排序
SELECT * FROM table 1 where id in(12,6,4,3,13)
我可以单独使用sql吗?还是我需要编写自己的排序函数?
我有一个类似于下面的查询,我希望记录以与在'in'函数中指定的id相同的顺序返回。根据函数中的SQL内部的顺序对列进行排序
SELECT * FROM table 1 where id in(12,6,4,3,13)
我可以单独使用sql吗?还是我需要编写自己的排序函数?
可以使用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-05 16:31:57
是可扩展的解决方案吗?说像100-10k ID? – thunderbird 2013-05-05 16:33:10
@AmitSingh然后您可以为此创建动态SQL,或者在应用程序级别创建一条生成条件排序的语句。 – 2013-05-05 16:33:19
创建一个表,你的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使其接近动态 – 2013-05-06 03:58:19
如果你想要它动态的,你可能需要一个函数。 – dantibb 2013-05-06 11:41:32
插入将它们转换为具有两列的临时表或表值参数。 'id'和'SortOrder'并加入而不是使用'in'。然后你可以在第二栏订购。 – 2013-05-05 16:40:02