在SQL Select中维护WHERE顺序

时间:2009-07-22 19:59:12

标签: sql where

在为特定记录执行SELECT时是否可以维护WHERE子句的顺序?

例如,给出以下SELECT语句:

SELECT [RecSeq] FROM [MyData] WHERE
[RecSeq]=3 OR [RecSeq]=2 OR [RecSeq]=1 OR [RecSeq]=21 OR [RecSeq]=20 OR 
[RecSeq]=19 OR [RecSeq]=110 OR [RecSeq]=109 OR [RecSeq]=108 OR 
[RecSeq]=53 OR [RecSeq]=52 OR [RecSeq]=51;

我希望结果能够回归:

3
2
1
21
20
19
110
109
108
53
53
51

然而,我所得到的并不是任何特定的顺序。目前我有一个循环,为每个所需的记录调用SELECT语句。这可以是1到700,000次。毋庸置疑,表现并不是最好的。

任何解决方案还是我陷入了循环?

6 个答案:

答案 0 :(得分:5)

您需要ORDER BY FIELD子句。

SELECT RecSeq From MyData WHERE RecSeq IN (3, 2, 1, 21, 20, 19, 110, 109, 108, 53, 52, 51)
ORDER BY FIELD (RecSeq, 3, 2, 1, 21, 20, 19, 110, 109, 108, 53, 52, 51);

你没有说你正在使用什么数据库系统 - 我知道这在MySQL中有效。

答案 1 :(得分:4)

可靠的一种方法是可靠地强制执行sql语句结果的排序:使用order by子句。我不知道它是不是标准的sql,但是在oracle中你可以这样做:

select ... from ...
where recseq in ( 3, 2, 1, 21, 20, 19, 110, 109, 108, 53, 53, 51)
order by decode(recseq 3,1, 2,2, 1,3, 21,4, 20,5, 19,6, 110,7, 109,8, 108,9, 53,10, 53,11, 51,12,13)

答案 2 :(得分:2)

WHERE子句无法指定您的输出顺序。

您必须使用“order by”对结果进行排序。

如果您绝对需要此订单,请尝试使用带有union子句的'伪列'或假列(此处有性能警告)。

select 0 as my_fake_column, blah_columns from table where recseq = 3
UNION
select 1,  blah_columns from table where recseq = 2
UNION
select 2,  blah_columns from table where recseq = 1
UNION
select 3,  blah_columns from table where recseq = 21
order by my_fake_column

以上将按照您的特定订单3,2,1,21。

提供结果

正如另一张海报所说,添加一列可能是一种选择。

答案 3 :(得分:1)

雅有一种方法,但有些人可能认为这是一种黑客行为。另外,我想指出你可以/应该使用IN函数而不是巨大的条件语句。

SELECT [RecSeq] 
  FROM [MyData]
 WHERE [RecSeq] in (3,2,1,21,20,19,110,109,108,53,52,51)
ORDER BY DECODE (recseq 3,1, 2,2, 1,3, 21,4,......)

答案 4 :(得分:1)

您可以使用派生表过滤排序,如此

SELECT  t.RecSeq
FROM    MyData t
JOIN    (
        SELECT 3, 1 UNION ALL
        SELECT 2, 2 UNION ALL
        SELECT 1, 3 UNION ALL
        SELECT 21, 4 UNION ALL
        SELECT 20, 5 UNION ALL
        SELECT 19, 6
        ...
        ) f(RecSeq, SortKey)
ON      t.RecSeq = f.RecSeq
ORDER BY f.SortKey

答案 5 :(得分:0)

您可以尝试使用UNION。类似的东西:

SELECT [RecSeq], 1 FROM [MyData] WHERE [RecSeq]=3
UNION
SELECT [RecSeq], 2 FROM [MyData] WHERE [RecSeq]=2
UNION
SELECT [RecSeq], 3 FROM [MyData] WHERE [RecSeq]=1
*etc...*
ORDER BY 2