2011-08-25 17 views
8

ओरेकल के वर्चर्स सॉर्ट ऑर्डर वर्कर तुलना के व्यवहार से मेल नहीं खाता है?

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; 

की तरह एक एसक्यूएल बयान पैदावार

B002AACD0A 
000000000000 
978123456789 

कहां-प्रतिबंध uncommenting के बाद, परिणाम

B002AACD0A 
978123456789 

है मैं परिणाम की उम्मीद है सिर्फ 978123456789B002AACD0A के बाद होने की होगी प्रतिबंध के बिना क्वेरी चलाते समय 000000000000 से पहले वापस कर दिया गया है।

इस व्यवहार को कैसे समझाया जा सकता है? और मुझे वर्चर्स को क्रमबद्ध और तुलना करने के लिए कैसे किया जाता है ताकि वे एक साथ काम कर सकें जैसे कि मैं पूर्णांक के साथ कर सकता हूं?

संपादित करें: x>'B002AACD0A' पर प्रतिबंध बदलने पर पर्याप्त मजेदार, परिणाम खाली है। इसे x>978123456789 पर बदलकर B002AACD0A लौटाता है।

आईई। जब की तुलना:

B002AACD0A > 978123456789 > 000000000000 

लेकिन जब

978123456789 > 000000000000 > B002AACD0A 

संपादित 2 छँटाई: स्पष्ट रूप (order by NLSSORT(x,'NLS_SORT=BINARY_AI')) बाइनरी तरह उपयोग करते हैं, परिणाम B002AACD0A>978123456789>000000000000 है और तुलना के व्यवहार से मेल खाता है। लेकिन मुझे अभी भी कोई संकेत नहीं है कि यह क्यों हो रहा है।

+0

ओरेकल का कौन-सा संस्करण पर कर रहे हैं? मैं कुछ बहुत अलग देखता हूं ... मुझे 000000000000, 978123456789, बी 002 एएसीडी 0 ए पहली क्वेरी के साथ मिलता है, फिर 978123456789, बी 002 एएसीडी 0 ए जहां असम्बद्ध होता है। मेरा ver 10.2.0.3.0 है। – greghmerrill

+0

मैं 10.2.0.4.0 का उपयोग कर रहा हूं। मैं इस तरह के व्यवहार को अलग करने के लिए आश्चर्यचकित नहीं हूं, शायद 'एनएलएस_SORT' सेटिंग से संबंधित है (मेरे मामले में, यह' जर्मनी 'है)। लेकिन वैसे भी, मैं एक ही प्रश्न के भीतर समान तरीके से व्यवहार करने की तुलना करता हूं और तुलना करता हूं ... –

+0

9.2.0.7.0, 10.2.0.1.0, 11.2.0.1.0 और 11.1.0.6.0 (नहीं पूछें) सभी वापसी 000000000000, 978123456789, बी 002 एएसीडी 0 ए ... – Ben

उत्तर

13

पतरस,

छंटाई के व्यवहार, NLS_SORT सत्र पैरामीटर द्वारा नियंत्रित किया जाता है, जबकि तुलना के लिए व्यवहार NLS_COMP पैरामीटर पर निर्भर है है। आपके पास एक मेल नहीं होना चाहिए।

मैं निम्नलिखित मानकों के साथ एक ही परिणाम प्राप्त करने के रूप में आप कार्य करें:

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

बढ़िया! इसे इंगित करने के लिए बहुत बहुत धन्यवाद, मुझे नहीं पता था कि एनएलएस_Cओएमपी नामक एक पैरामीटर है। –