Oracle में पूर्ण-पाठ अनुक्रमणिका का उपयोग किए बिना केस-असंवेदनशील खोज करने के 3 मुख्य तरीके हैं।
अंतत:आप कौन सा तरीका चुनते हैं यह आपकी व्यक्तिगत परिस्थितियों पर निर्भर करता है; याद रखने वाली मुख्य बात यह है कि प्रदर्शन को बेहतर बनाने के लिए आपको केस-असंवेदनशील खोज के लिए सही ढंग से अनुक्रमित करना होगा।
<एच4>1. अपने कॉलम और स्ट्रिंग को एक समान रखें।
आप UPPER()
. का उपयोग करके अपने सभी डेटा को एक ही केस के लिए बाध्य कर सकते हैं या LOWER()
:
select * from my_table where upper(column_1) = upper('my_string');
या
select * from my_table where lower(column_1) = lower('my_string');
अगर column_1
upper(column_1)
पर अनुक्रमित नहीं है या lower(column_1)
, जैसा उपयुक्त हो, यह एक पूर्ण तालिका स्कैन को बाध्य कर सकता है। इससे बचने के लिए आप एक फ़ंक्शन-आधारित अनुक्रमणिका बना सकते हैं।
create index my_index on my_table ( lower(column_1) );
यदि आप LIKE का उपयोग कर रहे हैं तो आपको एक %
. को जोड़ना होगा आप जिस स्ट्रिंग को खोज रहे हैं उसके आस-पास.
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
यह SQL Fiddle दर्शाता है कि इन सभी प्रश्नों में क्या होता है। व्याख्या योजनाओं पर ध्यान दें, जो इंगित करती हैं कि किसी अनुक्रमणिका का उपयोग कब किया जा रहा है और कब नहीं।
<एच4>2. रेगुलर एक्सप्रेशन का प्रयोग करें।
Oracle 10g से आगे REGEXP_LIKE()
उपलब्ध है। आप _match_parameter_ 'i'
. निर्दिष्ट कर सकते हैं , केस-असंवेदनशील खोज करने के लिए।
इसे एक समानता ऑपरेटर के रूप में उपयोग करने के लिए आपको स्ट्रिंग के प्रारंभ और अंत को निर्दिष्ट करना होगा, जिसे कैरेट और डॉलर चिह्न द्वारा दर्शाया जाता है।
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
LIKE के समकक्ष प्रदर्शन करने के लिए, इन्हें हटाया जा सकता है।
select * from my_table where regexp_like(column_1, 'my_string', 'i');
इससे सावधान रहें क्योंकि आपके स्ट्रिंग में ऐसे वर्ण हो सकते हैं जिनकी रेगुलर एक्सप्रेशन इंजन द्वारा अलग-अलग व्याख्या की जाएगी।
यह SQL Fiddle आपको REGEXP_LIKE() का उपयोग करने के अलावा वही उदाहरण आउटपुट दिखाता है।
<एच4>3. इसे सत्र स्तर पर बदलें।
NLS_SORT पैरामीटर ऑर्डर करने के लिए कोलेशन अनुक्रम और =
सहित विभिन्न तुलना ऑपरेटरों को नियंत्रित करता है। और जैसे। आप सत्र को बदलकर एक बाइनरी, केस-असंवेदनशील, सॉर्ट निर्दिष्ट कर सकते हैं। इसका मतलब यह होगा कि उस सत्र में की गई प्रत्येक क्वेरी केस-असंवेदनशील पैरामीटर निष्पादित करेगी।
alter session set nls_sort=BINARY_CI
यदि आप एक अलग भाषा निर्दिष्ट करना चाहते हैं, या BINARY_AI का उपयोग करके एक उच्चारण-असंवेदनशील खोज करना चाहते हैं, तो भाषाई सॉर्टिंग और स्ट्रिंग खोज के आसपास बहुत सारी अतिरिक्त जानकारी है।
आपको NLS_COMP पैरामीटर को भी बदलना होगा; उद्धृत करने के लिए:
<ब्लॉकक्वॉट>NLS_SORT पैरामीटर का पालन करने वाले सटीक ऑपरेटर और क्वेरी क्लॉज़ NLS_COMP पैरामीटर के मान पर निर्भर करते हैं। यदि कोई ऑपरेटर या क्लॉज NLS_SORT मान का पालन नहीं करता है, जैसा कि NLS_COMP द्वारा निर्धारित किया गया है, तो उपयोग किया जाने वाला संयोजन BINARY है।
NLS_COMP का डिफ़ॉल्ट मान BINARY है; लेकिन, LINGUISTIC निर्दिष्ट करता है कि Oracle को NLS_SORT के मान पर ध्यान देना चाहिए:
<ब्लॉकक्वॉट>WHERE क्लॉज और PL/SQLblocks में सभी SQL ऑपरेशंस के लिए तुलना NLS_SORTपैरामीटर में निर्दिष्ट भाषाई सॉर्ट का उपयोग करना चाहिए। प्रदर्शन को बेहतर बनाने के लिए, आप उस कॉलम पर भाषाई सूचकांक भी परिभाषित कर सकते हैं जिसके लिए आप भाषाई तुलना चाहते हैं।
तो, एक बार फिर, आपको सत्र को बदलने की जरूरत है
alter session set nls_comp=LINGUISTIC
जैसा कि दस्तावेज़ीकरण में उल्लेख किया गया है, आप प्रदर्शन को बेहतर बनाने के लिए एक भाषाई सूचकांक बनाना चाह सकते हैं
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));