25

「IN」条件節から順序を保つことは可能ですか?

SOでこの質問を見つけましたが、彼の例では、OPにはすでにソートされた「IN」句があります。

私の場合は異なります.「IN」句はランダムな順序です.次のようなもの:

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField IN (45,2,445,12,789)

(45,2,445,12,789) の順序で結果を取得したいと思います。Oracle データベースを使用しています。SQL には、条件節で使用して節の順序を維持するように指定できる属性があるかもしれません。

4

5 に答える 5

22

ORDER BY句を使用しない限り、信頼できる順序付けはありません。

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField IN (45,2,445,12,789)
order by case TestResult.SomeField
         when 45 then 1
         when 2  then 2
         when 445 then 3
         ...
         end

クエリを5つのクエリに分割して、すべてを結合することもできます...

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField = 4
union all
SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField = 2
union all
...

私は前者の方法をもっと信頼し、おそらくはるかに優れたパフォーマンスを発揮するでしょう。

于 2013-01-03T13:35:56.650 に答える
3

これを試して:

SELECT T.SomeField,T.OtherField
FROM TestResult T
 JOIN 
   (
     SELECT 1 as Id, 45 as Val FROM dual UNION ALL
     SELECT 2, 2 FROM dual UNION ALL
     SELECT 3, 445 FROM dual UNION ALL
     SELECT 4, 12 FROM dual UNION ALL
     SELECT 5, 789  FROM dual
   ) I
   ON T.SomeField = I.Val
ORDER BY I.Id
于 2013-01-03T13:37:04.283 に答える
2

文字列関数を使用する代替手段があります。

with const as (select ',45,2,445,12,789,' as vals)
select tr.*
from TestResult tr cross join const
where instr(const.vals, ','||cast(tr.somefield as varchar(255))||',') > 0
order by instr(const.vals, ','||cast(tr.somefield as varchar(255))||',')

これを提供するのは、中間テーブルよりも値の文字列を維持する方が簡単だと思われるからです。

于 2013-01-03T14:20:11.823 に答える