2010-07-15 12 views
7

जैसे नियमित अभिव्यक्ति को फ़ंक्शन (एमएसएसक्यूएल) के अंदर LIKE में परिवर्तित करने का कोई अच्छा तरीका है? sproc इस तुलना में अधिक जटिल नहीं मिलता है:एसईसीएल RegEx

(country\=)(?<Country>[\w\d]+)(\&sessionid\=)(?<SessionId>.+) 

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

मैं की तरह देर से एक sproc अंदर इस का उपयोग करना चाहते हैं:

SELECT * FROM [Table] 
WHERE test_regex(regex, 'text') = 1 

कहाँ regex की [तालिका]

+1

आप क्या करने की कोशिश कर रहे हैं? कुछ प्रकार की टेबल आधारित प्रेषण तंत्र जहां नियम नियमित अभिव्यक्ति के रूप में व्यक्त किए जाते हैं? ... अगर मैं सही ढंग से अनुमान लगाता हूं तो बस उत्सुक हूं। –

+0

मैं पार्सिंग लॉग फ़ाइलों को मानता हूं। यह एक क्वेरी स्ट्रिंग की तरह दिखता है। –

+0

टोमेक सही हैं :) – Andreas

उत्तर

4

सीएलआर फ़ंक्शन का उपयोग करके SQL सर्वर पर नियमित अभिव्यक्ति पार्सिंग जोड़ना संभव है। यह एसक्यूएल 2005 और ऊपर से संभव है। एक महान उदाहरण के लिए here देखें।

+0

अंततः उनसे एक जवाब मिला, ठीक काम करना चाहिए .. धन्यवाद। और भले ही आपका उत्तर मेरे प्रश्न का उत्तर नहीं दे रहा है, यह मेरी समस्या हल करता है .. इसलिए मैं इसे हल के रूप में चिह्नित करता हूं :) – Andreas

+1

जबकि यह लिंक प्रश्न का उत्तर दे सकता है, तो यहां उत्तर के आवश्यक हिस्सों को शामिल करना और बेहतर प्रदान करना बेहतर है संदर्भ के लिए लिंक। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं – Moes

3

चेक एसक्यूएल के इस समारोह एक हिस्सा है। बॉक्स से बाहर नहीं PATINDEX('%[^0-9\.]%',@Input)

PATINDEX (Transact-SQL)

+0

क्या फ़ंक्शन को बताने का कोई तरीका है कि अभिव्यक्ति के कई उदाहरण, जैसे regex: s "+" या "*"। उदाहरण के लिए PATINDEX ('% [a-c] +%', @ इनपुट) – Andreas

+0

नहीं, मुझे यह नहीं लगता कि यह संभव है –

1

: यह मदद मिल सकती है आप अपने कार्य को प्राप्त करने के लिए। एसक्यूएल सर्वर में एक regex खोज में सबसे नज़दीक आप PATINDEX() है, लेकिन यह नियमित अभिव्यक्ति नहीं करता है।

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

2

जो एक बड़ी मेज पर बहुत धीमी गति से चलेंगे, प्रत्येक पंक्ति पर स्ट्रिंग कॉलम को पार्स कर देगा।

यदि आप तालिका बदल सकते हैं, तो उस स्ट्रिंग कॉलम को अलग-अलग कॉलम में विभाजित करना बेहतर हो सकता है, ताकि आप अधिक पारंपरिक WHERE country=... AND sessionid=... प्राप्त कर सकें, आप इस तरह से एक इंडेक्स भी जोड़ और उपयोग कर सकते हैं।

4

मैं कल्पना करता

SELECT ... 
FROM [Table] 
WHERE col LIKE 'country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%' 

इतने पास हो सकता है? यदि उद्देश्य केवल खाली देश और सत्रिक मूल्यों के साथ रिकॉर्ड वापस लाने के लिए है।

यदि कॉलम में मूल्य अनिवार्य रूप से 'देश' से शुरू नहीं होता है तो आपको WHERE col LIKE '%country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%' का उपयोग करना होगा जो केएम के उत्तर के अनुसार चीजों को काफी धीमा कर सकता है।

1

SQL# के भीतर RegEx कार्यक्षमता का उपयोग करें जो निःशुल्क है। मेरे पास इस दृष्टिकोण के साथ कोई प्रदर्शन समस्या नहीं है।