2011-08-25 2 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를 정렬하고 비교하여 정수로 할 수있는 것처럼 함께 작업 할 수있는 방법은 무엇입니까?

편집 : 제한 사항을 x>'B002AACD0A'으로 변경하면 결과가 비어 있습니다. x>978123456789으로 변경하면 B002AACD0A이 반환됩니다.

e.e.

B002AACD0A > 978123456789 > 000000000000 

을하지만

978123456789 > 000000000000 > B002AACD0A 

편집 2을 정렬 할 때 : 비교할 때 명시 적으로 (order by NLSSORT(x,'NLS_SORT=BINARY_AI')) 이진 정렬을 사용하는 경우, 결과는 B002AACD0A>978123456789>000000000000과 비교 동작을 일치합니다. 그러나 나는 아직도 이것이 일어나는 이유를 알지 못합니다. 비교를 위해 동작은 NLS_COMP 파라미터에 의존하는 반면

+0

오라클의 어떤 버전의 당신에 있습니까? 나는 아주 다른 것을 본다. 나는 000000000000, 978123456789, B002AACD0A를 첫 번째 질의로 얻고, 그 다음 978123456789, B002AACD0A를 얻을 때 어디에서 주석을 제거 할 수있다. 내 버전은 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 

을 결과가 일치 :

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라는 매개 변수가 있다는 것을 몰랐습니다. –