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

टी-एसक्यूएल में एसक्यूएल सर्वर रेगुलर एक्सप्रेशन वर्कअराउंड?

दुर्भाग्य से, आप अपने CLR फ़ंक्शन को SQL Azure में स्थानांतरित नहीं कर पाएंगे। आपको या तो सामान्य स्ट्रिंग फ़ंक्शंस (PATINDEX, CHARINDEX, LIKE, और इसी तरह) का उपयोग करना होगा या डेटाबेस के बाहर ये ऑपरेशन करना होगा।

संपादित करें प्रश्न में जोड़े गए उदाहरणों के लिए कुछ जानकारी जोड़ना।

ईमेल पता

यह हमेशा विवादास्पद होता है क्योंकि लोग इस बात से असहमत होते हैं कि वे RFC के किस संस्करण का समर्थन करना चाहते हैं। मूल ने एपोस्ट्रोफ का समर्थन नहीं किया, उदाहरण के लिए (या कम से कम लोग जोर देते हैं कि यह नहीं था - मैंने इसे अभिलेखागार से नहीं खोला है और इसे स्वयं पढ़ा है, स्वीकार्य रूप से), और इसे नए के लिए अक्सर विस्तारित किया जाना है TLDs (एक बार 4-अक्षर वाले TLD जैसे .info के लिए, फिर 6-अक्षर वाले TLD जैसे .museum के लिए)। मैंने अक्सर काफी जानकार लोगों को यह कहते सुना है कि पूर्ण ई-मेल सत्यापन असंभव है, और पहले एक ई-मेल सेवा प्रदाता के लिए काम कर चुके, मैं आपको बता सकता हूं कि यह एक निरंतर गतिशील लक्ष्य था। लेकिन सबसे आसान तरीकों के लिए, प्रश्न देखें ) ।

एक अंकीय अंक

शायद गुच्छा में से सबसे आसान:

WHERE @s LIKE '[0-9]';

क्रेडिट कार्ड नंबर

मान लें कि आप डैश और रिक्त स्थान को हटा देते हैं, जो आपको किसी भी स्थिति में करना चाहिए। ध्यान दें कि यह सुनिश्चित करने के लिए क्रेडिट कार्ड नंबर एल्गोरिदम की वास्तविक जांच नहीं है कि संख्या वास्तव में मान्य है, बस यह सामान्य प्रारूप के अनुरूप है (एएमईएक्स =15 अंक 3 से शुरू होते हैं, शेष 16 अंक हैं - वीज़ा 4 से शुरू होता है, मास्टरकार्ड 5 से शुरू होता है, डिस्कवर 6 से शुरू होता है और मुझे लगता है कि एक है जो 7 से शुरू होता है (हालाँकि वह किसी प्रकार का उपहार कार्ड हो सकता है)):

WHERE @s + ' ' LIKE '[3-7]'+ REPLICATE('[0-9]', 14) + '[0-9 ]';

यदि आप लंबे समय तक चलने की कीमत पर थोड़ा और सटीक होना चाहते हैं, तो आप कह सकते हैं:

WHERE (LEN(@s) = 15 AND @s LIKE '3'     + REPLICATE('[0-9]', 14))
   OR (LEN(@s) = 16 AND @s LIKE '[4-7]' + REPLICATE('[0-9]', 15));

यूएसए फोन नंबर

दोबारा, यह मानते हुए कि आप पहले कोष्ठक, डैश और रिक्त स्थान को अलग करने जा रहे हैं। निश्चित रूप से एक यूएस क्षेत्र कोड 1 से शुरू नहीं हो सकता है; यदि अन्य नियम हैं, तो मुझे उनकी जानकारी नहीं है।

WHERE @s LIKE '[2-9]' + REPLICATE('[0-9]', 9);

-----

मैं आगे नहीं जा रहा हूँ, क्योंकि आपके द्वारा परिभाषित कई अन्य अभिव्यक्तियों को ऊपर से एक्सट्रपलेशन किया जा सकता है। उम्मीद है कि यह आपको एक शुरुआत देता है। आपको कुछ अन्य लोगों के लिए Google को यह देखने में सक्षम होना चाहिए कि अन्य लोगों ने टी-एसक्यूएल के साथ पैटर्न को कैसे दोहराया है। उनमें से कुछ (सप्ताह के दिनों की तरह) शायद सिर्फ एक टेबल के खिलाफ चेक किए जा सकते हैं - 7 संभावित मूल्यों के सेट के लिए एक आक्रामक पैटर्न मिलान करने के लिए अधिक लगता है। इसी तरह 1000 संख्याओं या वर्षों की सूची के साथ, ये ऐसी चीजें हैं जो यह जांचने के लिए बहुत आसान (और शायद अधिक कुशल) होंगी कि क्या संख्यात्मक मान किसी तालिका में है या नहीं, इसे स्ट्रिंग में बदलने के बजाय और देखें कि क्या यह किसी पैटर्न से मेल खाता है।

मैं फिर से कहूंगा कि इसमें से बहुत कुछ बेहतर होगा यदि आप डेटा को पहले स्थान पर डेटाबेस में आने से पहले शुद्ध और मान्य कर सकते हैं। आपको जहां भी संभव हो ऐसा करने का प्रयास करना चाहिए, क्योंकि सीएलआर के बिना, आप SQL सर्वर के अंदर शक्तिशाली RegEx नहीं कर सकते।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में महीने के नाम को महीने की संख्या में बदलें

  2. प्राथमिक कुंजी मर्ज विरोध को स्वचालित रूप से हल करें

  3. एक कॉलम बदलना:शून्य से शून्य नहीं

  4. SQL सर्वर में बड़ी मात्रा में पुराने डेटा को संग्रहित करना

  5. क्या डेटाटाइम 2 के लिए isdate () जैसा कोई फ़ंक्शन है?