Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

उप क्वेरी के परिणामों पर regexp का उपयोग कैसे करें?

इनमें से किसी एक प्रश्न का प्रयास करें:

SELECT a.phone_no
FROM admission a
JOIN users u on a.phone_no LIKE concat(u.phone_no, '__')
WHERE u.phone_no REGEXP  '^(99)+[0-9]+$'

या

SELECT a.phone_no
FROM admission a
JOIN users u on a.phone_no REGEXP concat('^', u.phone_no, '[0-9]{2}$')
WHERE u.phone_no REGEXP  '^(99)+[0-9]+$'

यदि "पिछला अंक" की संख्या निश्चित नहीं है, तो आप इसका उपयोग भी कर सकते हैं:

LIKE concat(u.phone_no, '%')

या

REGEXP concat('^', u.phone_no, '[0-9]*$')

लेकिन इस मामले में आपको SELECT DISTICT a.phone_no . का उपयोग करने की आवश्यकता हो सकती है यदि यह संभव है कि एक users.phone_no एक अन्य users.phone_no . का क्रम है (जैसे 99123 और 991234)।

अपडेट करें

उपयोगकर्ता तालिका के लिए 10K पंक्तियों और प्रवेश तालिका के लिए 100K पंक्तियों के साथ कुछ परीक्षण चलाने के बाद मैं निम्नलिखित प्रश्न पर आया:

SELECT a.phone_no
FROM admission a
JOIN users u 
    ON  a.phone_no >= u.phone_no
    AND a.phone_no < CONCAT(u.phone_no, 'z')
    AND a.phone_no LIKE CONCAT(u.phone_no, '%')
    AND a.phone_no REGEXP CONCAT('^', u.phone_no, '[0-9]*$')
WHERE   u.phone_no LIKE  '99%'
    AND u.phone_no REGEXP  '^(99)+[0-9]*$'
UNION SELECT 0 FROM (SELECT 0) dummy WHERE 0

fiddle

इस तरह आप REGEXP . का उपयोग कर सकते हैं और अभी भी बहुत अच्छा प्रदर्शन है। यह क्वेरी मेरे परीक्षण मामले में लगभग तुरंत निष्पादित होती है।

तार्किक रूप से आपको केवल REGEXP शर्तों की आवश्यकता है। लेकिन बड़ी टेबल पर क्वेरी का समय समाप्त हो सकता है। LIKE शर्त का उपयोग करने से REGEXP जाँच से पहले सेट किए गए परिणाम फ़िल्टर हो जाएंगे। लेकिन LIKE का उपयोग करने पर भी क्वेरी बहुत अच्छा प्रदर्शन नहीं करती है। किसी कारण से MySQL शामिल होने के लिए श्रेणी जांच का उपयोग नहीं करता है। इसलिए मैंने एक स्पष्ट श्रेणी जांच जोड़ी:

    ON  a.phone_no >= u.phone_no
    AND a.phone_no < CONCAT(u.phone_no, 'z')

इस चेक से आप जॉइन पार्ट से LIKE कंडीशन को हटा सकते हैं।

UNION भाग DISTICT का प्रतिस्थापन है। ऐसा लगता है कि MySQL DISTINCT को GROUP BY स्टेटमेंट में बदल देता है, जो अच्छा प्रदर्शन नहीं करता है। खाली परिणाम सेट के साथ यूनियन का उपयोग करके मैं MySQL को चयन के बाद डुप्लिकेट को हटाने के लिए मजबूर करता हूं। यदि आप अनुगामी अंकों की एक निश्चित संख्या का उपयोग करते हैं, तो आप उस रेखा को हटा सकते हैं।

आप REGEXP पैटर्न को अपनी आवश्यकताओं के अनुसार समायोजित कर सकते हैं:

...
    AND a.phone_no REGEXP CONCAT('^', u.phone_no, '[0-9]{2}$')
...
    AND u.phone_no REGEXP  '^(99)+[0-9]{8}$'
...

अगर आपको फ़ोन_नो की लंबाई जांचने के लिए केवल REGEXP की आवश्यकता है, तो आप '_' प्लेसहोल्डर के साथ LIKE शर्त का भी उपयोग कर सकते हैं।

    AND a.phone_no LIKE CONCAT(u.phone_no, '__')
...
    AND u.phone_no LIKE '99________$'

या किसी LIKE शर्त को STR_LENGTH चेक के साथ संयोजित करें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL को n दिन पहले टाइमस्टैम्प के रूप में तारीख मिलती है

  2. कोडनिर्देशक में फ़ोरैच जेनरेट की गई तालिका से कुल भुगतान की गणना करें

  3. क्वेरी फ़ील्ड में अंतिम वर्ण द्वारा समूह का चयन करें

  4. ईमेल पार्सिंग और प्रोसेसिंग आर्किटेक्चर

  5. रेडीस्टेडमेंट कैशिंग - इसका क्या मतलब है (यह कैसे काम करता है)