왜 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를 정렬하고 비교하여 정수로 할 수있는 것처럼 함께 작업 할 수있는 방법은 무엇입니까?
편집 : 제한 사항을 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
파라미터에 의존하는 반면
오라클의 어떤 버전의 당신에 있습니까? 나는 아주 다른 것을 본다. 나는 000000000000, 978123456789, B002AACD0A를 첫 번째 질의로 얻고, 그 다음 978123456789, B002AACD0A를 얻을 때 어디에서 주석을 제거 할 수있다. 내 버전은 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