2015-07-09 9 views
7

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

कुछ मामलों में, हालांकि यह संदेश के कुछ अन्य हिस्सों का चयन कर रहा है, और फिर यह infinitive पाश में समाप्त होता है।

(कोई भी संख्या 1 से 9 तक) + (चर लंबाई AZ केवल) + '/' + (चर:

पैटर्न मैं के लिए की तरह खंड का उपयोग कर चयन किया जाना रहा हूँ के प्रारूप में है लंबाई केवल एजेड) + सीआर या एलएफ या सीआरएलएफ की जगह।

--This is what I do have: 
DECLARE @match NVarChar(100) 
    SET @match = '%[1-9][a-z]%' 

DECLARE @input1 varchar(max),@input2 varchar(max) 
    SET @input1 ='1ABCD/EFGH *W/17001588 *RHELLO SMVML1C' 

DECLARE @position Int 
    SET @position = PATINDEX(@match, @input1); 

SELECT @position; 

--after the loop- it is also 'catching' the 1C at the end of the string: 

SET @input2  = '*W/17001588 *RHELLO SMVML1C' 
SET @position = PATINDEX(@match, @input2); 

SELECT @position 

---In order to eliminate this, I have tried to change @match: 

SET @match = '%[1-9][a-z][/][a-z]%' 

SET @position = PATINDEX(@match, @input1); 
SELECT @position --postion is 0, so the first item, that should have been selected, wasn't selected 
SET @position = PATINDEX(@match, @input2); 
SELECT @position --postion is 0 

मदद के लिए बहुत धन्यवाद!

+0

T-SQL नियमित अभिव्यक्ति नहीं है या किसी अन्य में निर्मित पैटर्न मैचर जो आप चाहते हैं वह करेगा। विशेष रूप से "किसी भी संख्या" और "चर लंबाई" भागों में समस्याएं पैदा करने जा रही हैं। –

+0

तो आपके नए मैच पर, '@ इनपुट 1'' के लिए, 'स्थिति' 1 होना चाहिए और '@ इनपुट 2' के लिए, 'स्थिति' 0 होना चाहिए? सही बात? –

+0

आप PATINDEX की सीमित क्षमताओं का उपयोग करके ऐसे इनपुट को पार्स नहीं कर सकते हैं। आपको या तो कोड में नियमित अभिव्यक्तियों का उपयोग करना चाहिए या एक वास्तविक पार्सर लिखना चाहिए। –

उत्तर

1

यह करने के लिए अपने मैच चर/मापदंड बदलने का प्रयास करें:

SET @match = '%[1-9][a-z]%[/][a-z]%' 

यह आपको वांछित परिणाम मिल जाएगा। संक्षेप में इसका अनुवाद यह कह रहा है, "मुझे पहले मैच की शुरुआती स्थिति प्राप्त करें जहां पैटर्न [कुछ भी] है - [1-9 से संख्या] - [एजे से एक पत्र] - [कुछ भी] - [स्लैश] - [से एक पत्र । az] - [कुछ भी]
आशा इस मदद करता है

+0

दुर्भाग्यवश है कि उसकी खोज के परिवर्तनीय लंबाई भागों से मेल नहीं खाएगा, 1 ए/एक मैच 1 एबीसी/डीफ़ नहीं है। यह टर्मिनल चरित्र से मेल खाता है। –

+0

वास्तव में यह 1 एबीसी/डीफ़ पर मेल खाता है .... यही दूसरा वाइल्डकार्ड हैंडल करता है।प्रश्न मैंने भी बदल दिया है क्योंकि मैंने अपना जवाब दिया था (मूल रूप से कोई टर्मिनल चरित्र नहीं था, न ही केवल स्लैश ए-जेड से पहले स्ट्रिंग था) –

0

मैं ऊपर टिप्पणी के साथ सहमत हैं, यह एक regex समस्या regex उपकरणों के साथ हल किया जा करने की जरूरत है मैं द्वारा SimpleTalk You can get their code and read their very thorough article बनाया विधानसभा की सिफारिश करेंगे

!।।।

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

बस क्षमा करें, रेगेक्स एक वास्तविक प्रसंस्करण होग है और SQL सर्वर में अनुक्रमण सूचकांक को कम करता है। इसका उपयोग केवल तभी करें जब आप इसका उपयोग नहीं कर सकते।

0

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

set @input = ' '[email protected]; 
set @match = '% [1-9][a-z]%'; 

आप सीआर और वाम मोर्चे के जैसे अन्य खाली स्थान के लिए खाते में करने के लिए अपने पैटर्न की जरूरत है, अपने पैटर्न ऐसा दिखाई दे सकता:

set @match = '%[ '+char(13)+char(10)+'][1-9][a-z]%'; 
संबंधित मुद्दे