像IN参数列表一样对SQL查询的结果进行排序

时间:2014-09-15 08:46:37

标签: sql

我正在进行类似

的查询
SELECT id,name FROM table WHERE id IN (2,1,4,3)

我想

id name
2  B
1  A
4  D
3  C

但我正在

1 A
2 B
3 C
4 D

有没有办法按照与IN之后的列表相同的方式对查询结果进行排序?

相信我,我有一个实际的理由,我需要它;)

2 个答案:

答案 0 :(得分:0)

SELECT id,name FROM table WHERE id IN (2,1,4,3)
ORDER BY CASE id
  WHEN 2 THEN 1
  WHEN 1 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

这可能会解决您的问题。


解决方案2,将列表插入临时表并为其运行序列

id, seq(+1 every new row added)
-----------------
2    1
1    2
4    3
3    4

然后将2个表连接在一起并按此顺序排序。

答案 1 :(得分:0)

好的,我自己做了。它有点疯狂,但它有效;)

DECLARE @IDs varchar(max)
DECLARE @nr int
DECLARE @znak varchar(1)
DECLARE @index int
DECLARE @ID varchar(max)

SET @IDs='7002,7001,7004,7003'
SET @nr=1
SET @index=1

IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
CREATE TABLE #temp (nr int, id int)

--fill temp table with Ids
WHILE @index<=LEN(@Ids)
BEGIN
 set @znak=''
 set @ID=''

 WHILE @znak<>',' AND @index<=LEN(@Ids)
 BEGIN
  SET @znak= SUBSTRING(@IDs,@index,1)
  IF @znak<>',' SET @ID=@ID+@znak
  SET @index=@index+1 
 END
 INSERT INTO #temp(nr,id) VALUES (@nr,CAST(@ID as int))
 SET @nr=@nr+1
END

-- select proper data in wanted order
SELECT MyTable.* FROM MyTable
INNER JOIN #temp ON MyTable.id=#temp.id
ORDER BY #temp.nr