समस्या:
आप Oracle में एक स्ट्रिंग को विभाजित करना चाहते हैं।
उदाहरण:
आपके पास एक वाक्य है, और आप इसे स्पेस कैरेक्टर से विभाजित करना चाहेंगे।
समाधान:
SELECT REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
परिणाम तालिका इस तरह दिखती है:
भाग |
---|
एक |
उदाहरण |
वाक्य। |
चर्चा:
एक स्ट्रिंग से सबस्ट्रिंग प्राप्त करने के लिए, आप Oracle के अंतर्निहित REGEXP_SUBSTR() फ़ंक्शन का उपयोग कर सकते हैं। इसमें चार तर्क होते हैं:
- सबस्ट्रिंग के लिए खोजी जाने वाली स्ट्रिंग।
- रेगुलर एक्सप्रेशन; यानी, वह पैटर्न जिसे आप खोजना चाहते हैं।
- वह स्थान जहां से आप पैटर्न की तलाश शुरू करना चाहते हैं (डिफ़ॉल्ट मान 1 है, जिसका अर्थ है स्ट्रिंग की शुरुआत से शुरू)।
- यह निर्दिष्ट करने वाली संख्या कि आप किस मिलान सबस्ट्रिंग को देखना चाहते हैं (डिफ़ॉल्ट मान
1
है) , जिसका अर्थ है कि पहला मेल खाने वाला सबस्ट्रिंग दिखाया जाना चाहिए)।
हमारे उदाहरण में, खोजी जाने वाली स्ट्रिंग है 'An example sentence.
' स्ट्रिंग में, आप उन सबस्ट्रिंग्स की तलाश करते हैं जो शब्द हैं, जिन्हें हम यहां रिक्त स्थान को छोड़कर किसी भी वर्ण के किसी भी समूह के रूप में परिभाषित करते हैं। यही कारण है कि हम पैटर्न निर्दिष्ट करते हैं '[^ ]+
', यानी, गैर-अंतरिक्ष वर्णों का कोई भी क्रम। [^ ]
अंतरिक्ष को छोड़कर किसी भी वर्ण के लिए खड़ा है, और +
संकेत ऐसे वर्णों की एक या अधिक घटनाओं के लिए खड़ा है। तीसरा तर्क डिफ़ॉल्ट होना चाहिए (1
), क्योंकि आप शुरू से ही पूरी स्ट्रिंग में शब्दों को देखना चाहते हैं। अंतिम तर्क सबसे कठिन है - खोजे जाने वाले प्रत्येक स्ट्रिंग के लिए आपको इसके मान को बदलने की आवश्यकता है। यह स्तर होना चाहिए - CONNECT BY
का उपयोग करके पदानुक्रमित प्रश्नों में उपलब्ध एक छद्म स्तंभ - जो, हमारे मामले में, CONNECT BY का उपयोग करने पर परिणाम में वर्तमान पंक्ति की पंक्ति संख्या के बराबर होगा। तो, आपके पास है:
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)
यह व्यंजक dual
. से चुना जाना चाहिए - जब आप वास्तविक तालिका से चयन नहीं करते हैं तो Oracle में उपयोग किया जाने वाला एक छद्म तालिका। फिर, आपको CONNECT BY
. करना चाहिए पदानुक्रमित क्वेरी ऑपरेटर, इस शर्त पर कि पुनर्प्राप्त किया गया सबस्ट्रिंग NULL
नहीं होना चाहिए . एक बार सभी शब्दों को पुनः प्राप्त करने के बाद पुनर्प्राप्त किया गया सबस्ट्रिंग NULL होगा; पदानुक्रमित क्वेरी तब निष्पादन को रोक देगी। तो, आपके पास है:
FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
आप यहां लेवल और कनेक्ट बाय के बारे में पढ़ सकते हैं।
यदि आप स्ट्रिंग को किसी अन्य सीमांकक द्वारा विभाजित करना चाहते हैं, तो आप आसानी से क्वेरी को संशोधित कर सकते हैं। उदाहरण के लिए, यदि आप स्ट्रिंग को अल्पविराम से विभाजित करना चाहते हैं, तो '[^ ]
बदलें +' से '[^,]+
'। यहां एक उदाहरण क्वेरी है:
SELECT REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) AS parts FROM dual CONNECT BY REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) IS NOT NULL;