2012-03-20 3 views
20

मैं कैसे एक मेज मामलों (ऊपरी और कम) बदलती में पात्रों के साथ varchar2 के एक स्तंभ के साथ सॉर्ट कर सकते हैं कर सकते हैं?कैसे मैं इन सबसे अलग मामलों (Oracle) में एक तालिका स्तंभ द्वारा

ANNIE 
annie 
BOB 
bob 
Daniel 

उत्तर

35

उपयोग lower(field), उदहारण के लिए:

ANNIE 
BOB 
Daniel 
annie 
bob 

क्या मैं चाहता हूँ कुछ इस तरह है:

उदाहरण के लिए, जब मैं नाम स्तंभ के द्वारा एक आदेश करते हैं, मैं निम्नलिखित परिणाम प्राप्त

select * from tbl order by lower(name) 

तो NLSSORT के बारे में अन्य उत्तर हो सकता है आप गैर-अंग्रेज़ी भाषाओं के लिए विशेष वर्ण को संबोधित करने की जरूरत है कि तुम क्या जरूरत है। यदि आप नहीं करते हैं तो मैं कोशिश करता हूं और KISS और lower() का उपयोग करता हूं क्योंकि इसे याद रखना और उपयोग करना और दूसरों (रखरखाव) द्वारा पढ़ना बहुत आसान है।

+1

जोड़ने की एक बात यह होगी कि इसका मतलब यह होगा कि जब तक 'निचला (नाम)' पर एक कार्यात्मक अनुक्रमणिका नहीं है, तो इस क्वेरी के साथ एक पूर्ण तालिका स्कैन किया जाएगा। – beny23

+6

इस क्वेरी को हमेशा ऑर्डर द्वारा या बिना किसी पूर्ण तालिका स्कैन की आवश्यकता होगी। आमतौर पर जो समस्या आप वर्णन कर रहे हैं वह WHERE खंड के साथ अधिक महत्वपूर्ण है। – DCookie

+3

@DCookie: क्या आप शर्त करना चाहते हैं? ;) उदा। तालिका से सभी कॉलम के साथ 'निचले (नाम)' पर एक कार्यात्मक अनुक्रमणिका का प्रयास करें = पूर्ण इंडेक्स स्कैन, प्लस कोई प्रकार नहीं :) - बस कहें ' –

7

आप ओरेकल के अपेक्षाकृत हाल के संस्करण का उपयोग कर रहे हैं, तो आप NLS_SORT/NLS_COMP स्थापित करने के बजाय कम() फ़ंक्शन का उपयोग पर गौर करना चाहिए।

आप उदाहरण को प्रभावित विश्व स्तर पर नहीं करना चाहते हैं, तो आप किसी विशिष्ट क्वेरी के दायरे के लिए NLS_SORT स्थापित करने के लिए NLSSORT() फ़ंक्शन का उपयोग कर सकते हैं।

SQL> create table case_insensitive(a varchar2(10)); 

Table created. 

SQL> insert into case_insensitive values('D'); 

1 row created. 

SQL> 
SQL> 
SQL> c/'D/'c 
    1* insert into case_insensitive values('c') 
SQL>/

1 row created. 

SQL> c/'c/'B 
    1* insert into case_insensitive values('B') 
SQL>/

1 row created. 

SQL> c/'B/'a 
    1* insert into case_insensitive values('a') 
SQL>/

1 row created. 

SQL> commit; 

Commit complete. 

SQL> select * from case_insensitive; 

A 
---------- 
D 
c 
B 
a 

SQL> select * from case_insensitive order by a; 

A 
---------- 
B 
D 
a 
c 

SQL> select * from case_insensitive order by nlssort(a,'NLS_SORT=BINARY_CI'); 

A 
---------- 
a 
B 
c 
D 

इस का एक अच्छा उदाहरण पाया जा सकता है here.

+0

एनएलएस_SORT/NLS_COMP सेट करना सभी प्रश्नों के व्यवहार को बदल देगा। जो अच्छा है अगर वह चाहता है। अगर ऐसा नहीं है तो इतना अच्छा नहीं है। –

+0

जरूरी नहीं है। मैं वापस जाउंगा और प्रदर्शन करने के लिए अपना उदाहरण संपादित करूंगा। –

+0

एनएलएसएसओआरटी और एनएलएस_SORT दोनों ओरेकल द्वारा परिभाषित हैं लेकिन विभिन्न चीजें हैं। इस उत्तर के शीर्ष ने एक पैरामीटर NLS_SORT संदर्भित किया। हालांकि मैंने टिप्पणी के बाद जोड़ा कोड एनएलएसएसओआरटी फ़ंक्शन का उपयोग करता है। तो यदि आप मूल रूप से एनएलएसएसओआरटी का मतलब रखते हैं, तो आप सही हैं कि मेरी टिप्पणी लागू नहीं होगी। NLSSORT http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions113.htm#SQLRF00678, NLS_SORT http://docs.oracle.com/cd/E11882_01/server.112/e25513/initparams152। एचटीएम # REFRN10127 –

12

एक अन्य विकल्प linguistic sorting प्रदर्शन करने के लिए NLSSORT समारोह का उपयोग है:

SQL> with test as (select 'ANNIE' as col from dual 
    2  union all select 'BOB' from dual 
    3  union all select 'Daniel' from dual 
    4  union all select 'annie' from dual 
    5  union all select 'bob' from dual 
    6  union all select 'Ångström' from dual 
    7  union all select 'ångström' from dual) 
    8 select col 
    9 from test 
10 order by nlssort(col, 'NLS_SORT = WEST_EUROPEAN') 
11/

COL 
---------- 
Ångström 
ångström 
ANNIE 
annie 
BOB 
bob 
Daniel 

फायदे और अधिक लचीलापन है। कोई एक साथ उच्चारण के साथ-साथ विभिन्न मामलों के साथ वर्णों को सॉर्ट कर सकता है। कोई भी specifying different values for NLS_SORT द्वारा किसी भाषा विशिष्ट तरीके से कुछ वर्णों का इलाज करने का विकल्प चुन सकता है। बराबर पात्रों के सेट के भीतर एक आदेश परिभाषित करता है। तो 'ए' और 'ए' एक साथ क्रमबद्ध होते हैं, लेकिन 'ए के भीतर, ऊपरी मामला पहले आता है। नुकसान मैं उम्मीद करता हूं कि NLSSORT लोअर से अधिक CPU का उपयोग करता है, हालांकि मैंने इसे चिह्नित नहीं किया है।

स्ट्रिंग, यह भी मिलान कुंजी के रूप में जाना वापस लौटे, रॉ डेटा प्रकार का है: और NLSSORT केवल longer strings का एक उपसर्ग का प्रयोग करेंगे। किसी दिए गए कॉलेशन के लिए दिए गए चार मान के परिणामस्वरूप कोलेक्शन कुंजी की लंबाई 2000 बाइट्स से अधिक हो सकती है, जो NLSSORT द्वारा लौटाए गए रॉ मूल्य की अधिकतम लंबाई है। इस मामले में, NLSSORT अधिकतम उपसर्ग के लिए संयोजन कुंजी की गणना करता है, या प्रारंभिक चार का सबस्ट्रिंग, ताकि गणना परिणाम 2000 बाइट्स से अधिक न हो। मोनोलिंगुअल कॉलेशन के लिए, उदाहरण के लिए फ्रेश, उपसर्ग लंबाई आमतौर पर 1000 वर्ण होती है। बहुभाषी collations के लिए, उदाहरण GENERIC_M के लिए, उपसर्ग आमतौर पर 500 वर्ण होते हैं। सटीक लम्बाई के आधार पर कम या उच्च हो सकता है और char में निहित वर्ण।

+0

भाषाई सॉर्टिंग के साथ इंडेक्स का उपयोग करने के बारे में जानकारी के लिए http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch5lingsort.htm#i1006421 देखें। –

+1

+1 अच्छा चित्रण। – DCookie

-1

आप इस

select col_name from table_name 
order by col_name ; 
0

के लिए Cluse द्वारा आदेश का उपयोग कर सकते आप INITCAP उदा उपयोग कर सकते हैं

SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC; 
+1

कोई ऐसा उत्तर देने का कोई कारण नहीं है जो किसी स्वीकृत व्यक्ति से बेहतर न हो। इसके अलावा, initcap नहीं करेगा ('एएनएनए' और 'एनी' पर विचार करें)। –

संबंधित मुद्दे