ओरेकल एसक्यूएल में एक विशिष्ट चरित्र तक एक विकल्प का चयन कैसे करें?


82

कहो मेरे पास एक तालिका स्तंभ है जिसमें परिणाम हैं:

ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore

मैं एक ऐसी क्वेरी लिखने में सक्षम होना चाहूंगा जो इस कॉलम को उक्त तालिका से चुनती है, लेकिन केवल अंडरस्कोर (_) वर्ण का विकल्प देता है। उदाहरण के लिए:

ABC
DEFGH
IJKLMNOP

SUBSTRING फ़ंक्शन कार्य के लिए प्रतीत नहीं होता है क्योंकि यह स्थिति-आधारित है और अंडरस्कोर की स्थिति भिन्न होती है।

मैंने TRIM फ़ंक्शन (RTRIM फ़ंक्शन विशेष रूप से) के बारे में सोचा:

SELECT RTRIM('listofchars' FROM somecolumn) 
FROM sometable

लेकिन मुझे यकीन नहीं है कि मुझे यह काम करने के लिए कैसे मिलेगा क्योंकि यह केवल पात्रों की एक निश्चित सूची / सेट को हटाने के लिए लगता है और मैं वास्तव में केवल उन पात्रों के बाद हूं जो अंडरस्कोर चरित्र तक ले जा रहे हैं।

जवाबों:


141

SUBSTR, INSTR और NVL (बिना अंडरस्कोर के स्ट्रिंग के लिए) के संयोजन का उपयोग करके आप जो चाहते हैं वह वापस आ जाएगा:

SELECT NVL(SUBSTR('ABC_blah', 0, INSTR('ABC_blah', '_')-1), 'ABC_blah') AS output
  FROM DUAL

परिणाम:

output
------
ABC

उपयोग:

SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, '_')-1), t.column) AS output
  FROM YOUR_TABLE t

संदर्भ:

परिशिष्ट

यदि Oracle10g + का उपयोग कर रहे हैं, तो आप REGEXP_SUBSTR के माध्यम से regex का उपयोग कर सकते हैं ।


धन्यवाद। बहुत खूबसूरत! (REGEXP_SUBSTR, के बारे में भी जानना अच्छा है।) मैंने ओरेकल में रेगेक्स समर्थन की तलाश करने के लिए भी नहीं सोचा था।
प्रेट्ज़ेल

ओरेकल में आप फ़ंक्शंस (स्टैंडअलोन या पैकेज में) बना सकते हैं और उनका चयन स्टेटमेंट में कर सकते हैं।
बार्ट करें

9
यदि मान उन मानों के विरुद्ध है जो आपके द्वारा खोजे जा रहे सबस्ट्रिंग में नहीं हैं। instrअगर आपके पास है तो 0 लौटाता है INSTR('ABC/D', '_')। अंत में आपके पास 0 से लेकर (0-1) तक का एक विकल्प है जो शून्य है। अच्छा नही।
मार्सेल स्ट्रॉ

41

यह REGEXP_SUBSTR का उपयोग करके किया जा सकता है आसानी से ।

इस्तेमाल करें

REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 

कहां STRING_EXAMPLE आपका स्ट्रिंग है।

प्रयत्न:

SELECT 
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 
from dual

यह आपकी समस्या का समाधान करेगा।


1
मैं इसे ओपी द्वारा चुने गए समाधान के साथ आगे बढ़ा रहा हूं क्योंकि यह एक चाल है। फिर भी यह ध्यान देने योग्य है कि यह समाधान @OMG पॉनीज़ की तुलना में बहुत धीमा है, खासकर यदि उन परिस्थितियों में उपयोग किया जाता है। मेरे परीक्षणों ने समान क्वेरी के प्रदर्शन के बारे में 6 बार धीमा दिखाया है। इस सवाल पर आगे भी
चर्चा होती है

मेरे परीक्षण में INSTRसमाधान बहुत अधिक समान रूप से उपवास करता है जितना कि REGEXPसमाधान।
एलेहर्म

7

आपको पहले अंडरस्कोर (INSTR का उपयोग करके) की स्थिति प्राप्त करने की आवश्यकता है और फिर रूट का उपयोग करके 1 चर्चर से (पॉस -1) तक स्ट्रिंग का हिस्सा प्राप्त करें।

  1  select 'ABC_blahblahblah' test_string,
  2         instr('ABC_blahblahblah','_',1,1) position_underscore,
  3         substr('ABC_blahblahblah',1,instr('ABC_blahblahblah','_',1,1)-1) result
  4*   from dual
SQL> /

TEST_STRING      POSITION_UNDERSCORE RES
---------------- ------------------  ---
ABC_blahblahblah                  4  ABC

दस्तावेज प्रलेखन

ससबट्र डॉक्यूमेंटेशन


6
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)  from dual

सही उत्तर है, जैसा कि user1717270 द्वारा पोस्ट किया गया है

यदि आप उपयोग करते हैं INSTR, तो यह आपको एक स्ट्रिंग के लिए स्थिति देगा जो मानता है कि इसमें "_" है। क्या होगा अगर यह नहीं है? वैसे इसका उत्तर 0. होगा। इसलिए, जब आप स्ट्रिंग प्रिंट करना चाहते हैं, तो यह प्रिंट होगा NULL। उदाहरण: यदि आप डोमेन को "host.domain" से हटाना चाहते हैं। कुछ मामलों में आपके पास केवल संक्षिप्त नाम होगा, अर्थात "होस्ट"। सबसे अधिक संभावना है कि आप "होस्ट" प्रिंट करना चाहेंगे। खैर, इसके साथ INSTRयह आपको देगा NULLक्योंकि इसे कोई "नहीं मिला।", अर्थात यह 0 से 0 तक प्रिंट होगा। इसके साथ REGEXP_SUBSTRआपको सभी मामलों में सही उत्तर मिलेगा:

SELECT REGEXP_SUBSTR('HOST.DOMAIN','[^.]+',1,1)  from dual;

मेज़बान

तथा

SELECT REGEXP_SUBSTR('HOST','[^.]+',1,1)  from dual;

मेज़बान



0

यह याद रखें कि यदि कॉलम में आपके सभी स्ट्रिंग्स का अंडरस्कोर नहीं है (... या अन्यथा यदि शून्य मान आउटपुट होगा):

SELECT COALESCE
(SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1), 
"STRING_COLUMN") 
AS OUTPUT FROM DUAL

0

बड़े स्ट्रिंग से किसी उप-स्ट्रिंग को खोजने के लिए:

string_value:=('This is String,Please search string 'Ple');

फिर स्ट्रिंग खोजने के लिए 'Ple'से String_valueहम के रूप में कर सकते हैं:

select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;

आपको परिणाम मिलेगा: Ple


0

यदि स्थिति में स्ट्रिंग की स्थिति ठीक नहीं है, तो नीचे दिए गए कथन के अनुसार हम अपेक्षित आउटपुट प्राप्त कर सकते हैं।

तालिका संरचना ID VARCHAR2 (100 BYTE) ग्राहक VARCHAR2 (4000 BYTE)


डेटा- ID CLIENT 1001 {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"}
1002 {"IdType": "AccountNo," Id ":" XXXXXXXX3521 ", "ToPricingId": "XXXXXXXX3521", "clientid": "टेस्ट ग्राहक", "CLIENTNAME": "MFX"}

आवश्यकता - CLIENT कॉलम में "ClientId" स्ट्रिंग खोजें और संबंधित मान लौटाएं। जैसे "क्लाइंटआईड" से: "कोन-बीजेपी" -> कोन-बीजेपी (अपेक्षित आउटपुट)

CLIENT, पदार्थ (मूल (CLIENT, instr (CLIENT, '"clientId": "') + लंबाई ('' clientId": "')), 1, instr (पदार्थ (CLIENT, instr (CLIENT,'" clientId)) का चयन करें : "') + लंबाई (' 'मुवक्किल": "')), '' ', 1) -1) कट_स्ट्रेंट TEST_SC से;

CLIENT cut_str ------------------------------------------------ ----------- ---------- {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"} con- bjp {"IdType": "AccountNo", "Id": "XXXXXXXX3521", "ToPricingId": "XXXXXXXX3521", "clientId": "Test-Cust", "clientName": "MFX"} Test-Cust

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.