आप REGEXP_REPLACE
का उपयोग कर सकते हैं :
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
आउटपुट
7654321
यह रेगेक्सपी कुछ अंकों से शुरू होने वाली स्ट्रिंग की तलाश करता है (^\d+
) उसके बाद कुछ गैर-अंकीय वर्ण ([^\d]+
) और फिर अंकों का दूसरा समूह ((\d+)
) स्ट्रिंग के अंत तक कुछ वर्णों के बाद (.*$
) ()
अंक वर्णों के दूसरे समूह के आसपास एक कैप्चरिंग समूह बनाता है, जिसे हम \1
के साथ प्रतिस्थापन स्ट्रिंग में संदर्भित कर सकते हैं . चूंकि REGEXP_REPLACE
केवल रेगेक्स से मेल खाने वाले स्ट्रिंग के हिस्सों को प्रतिस्थापित करता है, एक रेगेक्स होना आवश्यक है जो संपूर्ण से मेल खाता हो केवल वांछित डेटा के साथ इसे बदलने के लिए स्ट्रिंग।
अपडेट करें
यदि अंकों के पहले सेट से पहले संभावित वर्ण हैं, तो आपको रेगेक्स को
. में बदलना चाहिए^[^\d]*\d+[^\d]+(\d+).*$
अपडेट 2
यदि यह संभव है कि शुरुआत में संख्याओं का केवल एक सेट हो, तो हमें पहले भाग के मिलान को वैकल्पिक बनाना होगा। हम ऐसा गैर-कैप्चरिंग समूह के साथ कर सकते हैं:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
यह मिलान को अंकों के पहले सेट पर वैकल्पिक बनाता है ताकि यदि यह अस्तित्व में नहीं है (यानी अंकों का केवल एक सेट है) तो रेगेक्स अभी भी मेल खाएगा। एक गैर-कैप्चरिंग समूह का उपयोग करके (?:
. जोड़कर) समूह की शुरुआत में, हमें प्रतिस्थापन स्ट्रिंग को \1
. से बदलने की आवश्यकता नहीं है . अपडेट किया गया SQLFiddle