2011-08-25 17 views
8

Oracle'ın varchar sıralama düzeni neden varchar karşılaştırmasıyla uyuşmuyor?

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; 

gibi bir SQL deyimi NEREDE-kısıtlama uncommenting sonra

B002AACD0A 
000000000000 
978123456789 

verir, sonuç

B002AACD0A 
978123456789 

olduğunu ben sadece 978123456789B002AACD0A beri olması sonucunu beklerdik kısıtlama olmadan sorguyu çalıştırırken 000000000000'dan önce döndürülür.

Bu davranış nasıl açıklanabilir? Ve nasıl varcharları sıralamak ve karşılaştırmalıyım, böylece tamsayılarla yapabileceğim gibi birlikte çalışabilirler mi?

EDIT: Eğlence, x>'B002AACD0A' kısıtlama değiştirirken, sonuç yeterince boş. x>978123456789 olarak değiştirmek B002AACD0A değerini döndürür.

I.I.I.e.

B002AACD0A > 978123456789 > 000000000000 

ama

978123456789 > 000000000000 > B002AACD0A 

DÜZENLEME 2 sıralarken: karşılaştırırken explicitely (order by NLSSORT(x,'NLS_SORT=BINARY_AI')) ikili sıralama kullanarak, sonuç B002AACD0A>978123456789>000000000000 ve karşılaştırma davranışını eşleşir. Ama hala bunun neden olduğuna dair bir fikrim yok. karşılaştırmalar için davranış NLS_COMP parametreye bağlıdır, oysa

+0

kahin hangi sürümü size Hangi? Ben çok farklı bir şey görüyorum ... Ben ilk sorgulama ile 000000000000, 978123456789, B002AACD0A, sonra nerede uncommented 978123456789, B002AACD0A olsun. Verim 10.2.0.3.0. – greghmerrill

+0

10.2.0.4.0 kullanıyorum. Muhtemelen farklı davrandığını görmek beni şaşırtmadı, muhtemelen 'NLS_SORT' ayarı ile ilgili (benim durumumda, 'ALMAN'). Ama her neyse, ben sıralamak ve tek bir sorgu içinde benzer bir şekilde davranmak karşılaştırmak istiyorum ... –

+0

9.2.0.7.0, 10.2.0.1.0, 11.2.0.1.0 ve 11.1.0.6.0 (yok sor) tüm iade 000000000000, 978123456789, B002AACD0A ... – Ben

cevap

13

Peter, ayrıştırılması konusunda

davranış, NLS_SORT oturumu parametresi tarafından düzenlenir. Bir uyumsuzluğa sahip olmalısınız. senin gibi

aşağıdaki parametrelerle aynı sonucu elde: İki eşleştirilir Ancak

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

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

sonuç tutarlıdır:

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

Harika! Bunu işaret ettiğin için çok teşekkürler, NLS_COMP adında bir parametre olduğunu bilmiyordum. –