MySQL में REGEXP का उपयोग करके SUBSTRING का उपयोग कैसे करें


14

मेरी निम्नलिखित स्थिति है। मुझे MySQL का उपयोग करके विवरण से नियमित अभिव्यक्ति को प्रतिस्थापित करना होगा। विवरण:

Lorem D9801 ipsum मातम बैठ अमेट

जहां D9801 REGEXP है। हर मजबूत पाठ विवरण में अलग-अलग सामग्री होती है, लेकिन मेरा regexp ऐसा दिखता है: REGEXP 'D [[: digit:]]] "4}

REGEXP में हमेशा शुरुआत में "D" और अंत में "xxxx" - 4 अंक होते हैं: Dxxxx

मुझे पता है कि REGEXP केवल सही / गलत मूल्य देता है, लेकिन मैं केवल 'D9801' मान वापस करने के लिए क्वेरी कैसे कर सकता हूं?

मैंने कुछ इस तरह की कोशिश की:

SELECT SUBSTRING (description, LOCATE(REGEXP 'D[[:digit:]]{4}', description), 5)
FROM (
   SELECT "Lorem D9801 ipsum dolor sit amet" AS description
) temp

मुझे पता है कि यह गलत है, इसलिए मैं इसके साथ प्रयास करता हूं:

SELECT 
    id, 
    SUM(description REGEXP 'D[[:digit:]]{4}') AS matches, 
    CASE
        WHEN (SUM(description REGEXP 'D[[:digit:]]{4}') > 0) THEN 
            SUBSTRING(description, LOCATE( /*POSITION_OF_REGEXP_IN_DESC*/ , description), 5)
        ELSE 'Brak schematu'
    END AS show_substr FROM ps_description GROUP BY id;

लेकिन regexp की स्थिति कैसे पता करें?

मैंने यूडीएफ के बारे में सुना है लेकिन मैं इसका उपयोग नहीं कर सकता, मैं ओवीएच होस्टिंग का उपयोग करता हूं।


यह मूल रूप से एक डुबकी है: stackoverflow.com/questions/4021507/…
नाथन फ़ेगर

UDF का उपयोग किए बिना REGEXP फ़ंक्शन से मिलान किए गए पैटर्न को पुनः प्राप्त करने के लिए कार्यक्षमता में कोई निर्माण नहीं किया गया है और अन्य मिलान विधियां उस पूर्ण स्ट्रिंग को जानने पर भरोसा करती हैं जिसके लिए आप इस स्थिति में काम नहीं कर रहे हैं
पेलोड

जवाबों:


3

यह स्ट्रिंग से बाहर की जानकारी प्राप्त करने के लिए LOCATEऔर SUBSTRINGवाक्यविन्यास का उपयोग करने की आवश्यकता होगी । मूल खोज सिंटैक्स की आपको आवश्यकता होगी, यहाँ बताया गया है

LOCATE (खोज str, str, [स्थिति])

search str = एक स्ट्रिंग जिसे खोजा जाएगा।

str = एक तार जो खोजा जा रहा है।

स्थिति (वैकल्पिक) = वह स्थिति जहाँ से (दूसरे तर्क के भीतर) खोज शुरू होगी।

जबकि आपके पास जो फंक्शनिंग फंक्शन की जरूरत है, उसे यहां समझाया गया है

SUBSTRING (str, पॉज़, लेन)

str = एक तार।

पद = आरंभ करने की स्थिति।

len = वर्णों में लंबाई।

इसे देखने का आसान तरीका निम्नलिखित SUBSTRING के रूप में प्रतिस्थापित करने के बारे में सोचना है (लेन के लिए FROM pos से)

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

declare @String varchar(50) ='Lorem D9801 ipsum dolor sit amet'

SUBSTRING
(
@String,
LOCATE(' ', @String),
LOCATE(' ', @String, (LOCATE(' ', @String) + 1)) - LOCATE(' ', @String)
)

1

दुर्भाग्य से, MySQL की नियमित अभिव्यक्ति फ़ंक्शन सही, गलत या अशक्त है या नहीं, यह निर्भर करता है कि अभिव्यक्ति मौजूद है या नहीं।

वांछित व्यवहार को प्रभावित करने की चाल यह निर्धारित करने के लिए है कि आपके द्वारा परवाह किए जाने वाले चरित्र के साथ कौन सा विकल्प शुरू होता है, इसकी लंबाई सही है, और इसके बाद एक नंबर है। Substring_index फ़ंक्शन की एक श्रृंखला स्ट्रिंग को निकालने के लिए उपयोग की जाती है ...

set @string:='Lorem D9801 ipsum dolor sit amet';
select
case when @string like '% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',1),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',2),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',3),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',4),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
     when @string like '% D% D% D% D% D____ %' and cast((@num:= substring_index(substring_index(@string,concat(substring_index(@string,' D',5),' D'),-1),' ',1)) as signed) between '0' and '9999' then concat('D',@num)
end as test_case;
+-----------+
| test_case |
+-----------+
| D9801     |
+-----------+
1 row in set (0.00 sec)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.