2011-08-25 4 views
8

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 

である私はちょうど978123456789B002AACD0A以来となるように、結果を期待しているだろう制限なしでクエリを実行すると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パラメータに依存しているのに対し

+0

のOracleのバージョンは何あなたがオンになっていますか?私は非常に異なる何かを参照してください... 000000000000、978123456789、最初のクエリでB002AACD0Aを取得し、次に978123456789、B002AACD0Aのどこにコメントがないかを取得します。私のverは10.2.0.3.0です。 – greghmerrill

+0

私は10.2.0.4.0を使用しています。私は、おそらく 'NLS_SORT'設定(私の場合は' GERMAN')に関連して、振る舞いが異なっているのを見て驚くことはありません。しかし、とにかく、私は並べ替えを期待し、単一のクエリ内で同様の方法で動作するよう比較する... –

+0

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

答えて

13

ピーター、

選別の挙動は、NLS_SORTセッションパラメータによって調節されます。あなたは不一致がなければなりません。

次のパラメータでそうであるように、私は同じ結果を得る:

SQL> SELECT * 
    2 FROM nls_session_parameters 
    3 WHERE parameter IN ('NLS_COMP', 'NLS_SORT'); 

PARAMETER      VALUE 
------------------------------ ---------------------------------------- 
NLS_SORT      FRENCH 
NLS_COMP      BINARY 

2が一致したとき、しかし、結果は一致している:

SQL> alter session set nls_comp=LINGUISTIC; 

Session altered 

SQL> select * from (
    2 select '000000000000' as x from dual 
    3 union 
    4 select '978123456789' as x from dual 
    5 union 
    6 select 'B002AACD0A' as x from dual 
    7 ) /*where x>'000000000000'*/ order by x; 

X 
------------ 
B002AACD0A 
000000000000 
978123456789 

SQL> select * from (
    2 select '000000000000' as x from dual 
    3 union 
    4 select '978123456789' as x from dual 
    5 union 
    6 select 'B002AACD0A' as x from dual 
    7 ) where x > '000000000000' order by x; 

X 
------------ 
978123456789 
+0

素晴らしい!これを指摘してくれてありがとう、私はNLS_COMPというパラメータがあることを知らなかった。 –

関連する問題