2011-09-09 14 views
6

प्राप्त कर रहा हूं मैं ओरेकल में एसक्यूएल का उपयोग कर अल्पविराम से अलग स्ट्रिंग में एनएच तत्व प्राप्त करने की कोशिश कर रहा हूं।ओरेकल एसक्यूएल एनएच तत्व regexp

मैं निम्नलिखित है अब तक ..

SELECT regexp_substr(
    '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N', 
    '[^,]+', 
    1, 
    7) 
FROM dual; 

लेकिन जब तत्व खाली अर्थात है यह काम नहीं करता ,, किसी को भी मदद कर सकते हैं?

+4

जब आप आरडीबीएमएस में सीएसवी या अन्यथा क्रमबद्ध मान देखते हैं तो आप जानते हैं कि कुछ सही नहीं है। – NullUserException

+2

@NullUserException, अच्छा बिंदु। दुर्भाग्य से मैं इसे कई बार आया हूं :-( – Ollie

उत्तर

4

अपने सीमांकित मूल्यों हमेशा अल्पविराम के बीच में अल्फान्यूमेरिक रहे हैं तो आप की कोशिश कर सकते:

SELECT REGEXP_SUBSTR(<delimied_string>, '[[:alnum:]]{0,},', 1, 7) 
    FROM dual; 

सातवें मूल्य (अनुगामी अल्पविराम सहित) प्राप्त करने के लिए। यदि यह खाली है तो आप पिछली कॉमा प्राप्त करें (जिसे आप आसानी से हटा सकते हैं)।

जाहिर है, यदि आप सातवें के अलावा अन्य मूल्य चाहते हैं तो चौथे पैरामीटर मान को जो भी एनएवी घटना आप चाहते हैं उसे बदलें।

SELECT REGEXP_SUBSTR(<delimied_string>, '[[:alnum:]]{0,},', 1, <nth occurance>) 
    FROM dual; 

संपादित करें: सबसे पहले सभी के लिए अल्पविराम की जगह: मैं REGEX प्यार के रूप में यहाँ एक समाधान है कि भी अनुगामी अल्पविराम को हटा

SELECT REPLACE(
      REGEXP_SUBSTR(<delimied_string>, '[[:alnum:]]{0,},', 1, <nth>), 
      ',' 
     ) 
    FROM dual; 

आशा है कि यह मदद करता है

+0

+1, यह काम करता है। – DCookie

+0

हैलो ओली, मुझे एक ही समस्या है लेकिन आपकी सलाह मेरे मामले पर काम नहीं करती है। मुझे स्ट्रिंग से तीसरा मूल्य लेने की आवश्यकता है 'दोहरी से regexp_substr (' SENDER, 3B13, 3, 300,,,,, ',' [[: alnum:]] {0,}, ', 1, 2) का चयन करें;' लेकिन मुझे केवल * *, ** स्ट्रिंग क्या आप कृपया सलाह दे सकते हैं कि मैं क्या गलत कर रहा हूं? –

1

आप एक छोटे से चाल के साथ यह कर सकते हैं है

SQL> with data as 
    2 (select '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' txt 
    3  from dual 
    4 ) 
    5 select regexp_substr(txt,'[^,]+',1,7)        seventh_element_wrong 
    6  , replace(txt,',',', ')          with_extra_space_after_comma 
    7  , regexp_substr(replace(txt,',',', '),'[^,]+',1,7)   seventh_element_leading_space 
    8  , substr(regexp_substr(replace(txt,',',', '),'[^,]+',1,7),2) the_seventh_element 
    9 from data 
10/

S WITH_EXTRA_SPACE_AFTER_COMMA 
- ---------------------------------------------------------------------------------------------------------------------- 
SEVENTH_ELEMENT_LEADING_S THE_SEVENTH_ELEMENT 
------------------------- ------------------------ 
1 100016154, 5101884LT00001, , , , , 100000010892100000012655, L, SEI, 5101884LT00001, 1, SL, 3595.03, 00, 2, N, N, G, N 
100000010892100000012655 100000010892100000012655 

रैगर: एक अल्पविराम फिर एक रिक्ति, और बाद में से है कि अतिरिक्त प्रमुख अंतरिक्ष छोड़ डीएस,
रॉब।

1

जब तक आप नियमित अभिव्यक्ति पर अटक कर रहे हैं, यह रूप में अच्छी तरह से काम करता है:

WITH q AS (
SELECT '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' thestring FROM dual 
) 
SELECT SUBSTR(thestring, INSTR(thestring,',',1,6)+1, 
         INSTR(thestring,',',1,7)-INSTR(thestring,',',1,6)-1) "The Element" 
    FROM q; 

The Element 
------------------------ 
100000010892100000012655 

एक और संभावना है। आपने यह निर्दिष्ट नहीं किया है कि आपके डेटा का स्रोत क्या है। क्या आप संभवतः अपने इनपुट स्रोत को पढ़ने और SQL के माध्यम से संसाधित करने के लिए बाहरी तालिका का उपयोग कर सकते हैं?

+0

क्या केवल एक बार REGEXP_SUBSTR को कॉल करने के विरोध में INSTR को तीन बार कॉल करने में ओवरहेड होगा? (मुझे सीमित स्ट्रिंग हैन की लंबाई का एहसास है निर्दिष्ट नहीं किया गया है और एक कारक होगा) – Ollie

+0

@ ओली, यह केवल परिणामों को मापने के द्वारा ही आपको निश्चित रूप से पता चल जाएगा। REGEXP_ * फ़ंक्शंस अपने स्वयं के ओवरहेड मुद्दों के बिना नहीं हैं। – DCookie

0
SELECT rtrim(regexp_substr('100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N','[^,]{0,}[,]?',1,7),',') 
FROM dual; 
संबंधित मुद्दे