2011-08-09 23 views
1

可能重复:
SQL - order by list order任何标准SQL表达式对结果进行排序基地表达

是否有任何标准的SQL表达式来排序结果正好立足于表达。例如,要返回以下查询的结果,以便连续返回2,4,6,8。

SELECT * FROM SOMETABLE WHERE ID IN (2, 4, 6, 8) 
+1

那么,为你的情况:ORDER BY ID ASC;)只是开玩笑,我不知道是否有这样的事情。 – Jacob

+0

:)。这只是一个例子。 ID不一定排序。 – Mohsen

+0

给我们一个确切的解决方案的确切代码... – gbn

回答

1

我能想到的最接近的事是做一个JOIN而不是在一个表与原来的顺序与他们的次序等级

SELECT * FROM SOMETABLE INNER JOIN SOMETABLE2 ... etc 
ORDER BY SOMETABLE2.original 
1

如果你已经完全在你的SQL渲染控制,然后使用CASE表达式:

ORDER BY CASE ID 
-- render WHEN clauses in the desired order 
WHEN 2 THEN 1 
WHEN 4 THEN 2 
WHEN 6 THEN 3 
WHEN 8 THEN 4 
END 
0

假设可以传递的ID作为固定分隔的字符串,可以执行以下操作:

-- Populate a number table 
DECLARE @Temp Table(Number int) 

INSERT INTO @Temp VALUES(1) 
INSERT INTO @Temp VALUES(2) 
INSERT INTO @Temp VALUES(3) 
INSERT INTO @Temp VALUES(4) 
INSERT INTO @Temp VALUES(5) 
INSERT INTO @Temp VALUES(6) 
INSERT INTO @Temp VALUES(7) 
INSERT INTO @Temp VALUES(8) 
INSERT INTO @Temp VALUES(9) 
INSERT INTO @Temp VALUES(10) 

SELECT TOP 8000 Number = IDENTITY(int,1,1) INTO [dbo].Numberos FROM @TEMP t1, @TEMP t2, @TEMP t3, @TEMP t4 

ALTER TABLE [dbo].[Numbers] ADD CONSTRAINT [PK_Numbers] PRIMARY KEY CLUSTERED ([Number]) 

-- This function splits a fixed delimited string into a table object 
CREATE FUNCTION [dbo].[fixstring_single](@str text, @itemlen tinyint) 
RETURNS TABLE 
AS 
RETURN (SELECT listpos = n.Number, 
str = substring(@str, (@itemlen + 1) * (n.Number - 1) + 1, @itemlen) 
FROM Numbers n 
WHERE n.Number <= (datalength(@str)+1)/(@itemlen+1)) 

DECLARE @ids varchar(100); 
SET @ids = '00002 00001 00004'; 

-- Join to the number table ordered by the posisiton in the ids string 
SELECT * FROM TestT INNER JOIN fixstring_single(@ids, 5) S ON TestT.ID = S.Str ORDER BY S.listpos