2

在对特定记录执行 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 次之间。不用说性能不是最好的。

有什么解决方案还是我陷入了困境?

4

6 回答 6

8

你需要这个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 中有效。

于 2009-07-22T20:05:29.027 回答
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)
于 2009-07-22T20:05:47.577 回答
2

WHERE 子句不能指定您的输出顺序。

您必须使用“排序依据”对结果进行排序。

如果您绝对需要此顺序,请尝试使用 'pseudo-column' 或带有联合子句的假列(此处为性能警告)。

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 提供结果。

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

于 2009-07-22T20:05:43.580 回答
2

您可以使用派生表进行过滤排序,如下所示

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
于 2009-07-22T20:41:09.173 回答
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,......)
于 2009-07-22T20:08:39.737 回答
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
于 2009-07-22T20:10:13.557 回答