Oracleのvarcharソート順がvarchar比較の動作と一致しないのはなぜですか?
select * from (
select '000000000000' as x from dual
union
select '978123456789' as x from dual
union
select 'B002AACD0A' as x from dual
) /*where x>'000000000000'*/ order by x;
のようなSQL文がWHERE制限をコメント解除した後
B002AACD0A
000000000000
978123456789
をもたらし、結果は
B002AACD0A
978123456789
である私はちょうど978123456789
B002AACD0A
以来となるように、結果を期待しているだろう制限なしでクエリを実行すると000000000000
の前に返されます。
どのようにこの現象を説明できますか?そして、私はvarcharsを並べ替え、比較して、私が整数でできるように一緒に働くことができるようにするにはどうすればいいですか?
EDIT:面白いことに、制限をx>'B002AACD0A'
に変更すると、結果は空になります。 x>978123456789
に変更すると、B002AACD0A
が返されます。
I.e.比較した場合:
B002AACD0A > 978123456789 > 000000000000
しかし
978123456789 > 000000000000 > B002AACD0A
EDIT 2ソーティング:明示的に(order by NLSSORT(x,'NLS_SORT=BINARY_AI')
)バイナリ・ソートを使用する場合、結果はB002AACD0A>978123456789>000000000000
であり、比較の挙動と一致します。しかし、私はまだこれがどうして起こっているのか分からない。比較のための行動がNLS_COMP
パラメータに依存しているのに対し
のOracleのバージョンは何あなたがオンになっていますか?私は非常に異なる何かを参照してください... 000000000000、978123456789、最初のクエリでB002AACD0Aを取得し、次に978123456789、B002AACD0Aのどこにコメントがないかを取得します。私のverは10.2.0.3.0です。 – greghmerrill
私は10.2.0.4.0を使用しています。私は、おそらく 'NLS_SORT'設定(私の場合は' GERMAN')に関連して、振る舞いが異なっているのを見て驚くことはありません。しかし、とにかく、私は並べ替えを期待し、単一のクエリ内で同様の方法で動作するよう比較する... –
9.2.0.7.0,10.2.0.1.0、11.2.0.1.0、11.1.0.6.0(do not尋ねる)すべて返す000000000000、978123456789、B002AACD0A ... – Ben