2013-01-09 23 views
6

मैं एक लंबे NVARCHAR चर जहां मैं इस तरह कुछ पैटर्न बदलने की आवश्यकता है:मैं SQL में एक प्रतिस्थापन पैटर्न कैसे बना सकता हूं?

'Hello stackoverflow world' 

मैं कैसे कर सकते:

DECLARE @data NVARCHAR(200) = 'Hello [PAT1] stackoverflow [PAT2] world [PAT3]' 

मैं की तरह लग रहे करने के लिए एक रिक्त स्थान के साथ सभी [PAT%] प्रतिस्थापित करने की आवश्यकता यह SQL सर्वर 2008 में टी-एसक्यूएल का उपयोग कर रहा है?

मैं अन्य प्रश्नों में खोज रहा था, और मुझे केवल this मिला, लेकिन यह मेरी मदद नहीं करता है, क्योंकि मुझे स्ट्रिंग के मूल भाग को संरक्षित करने की आवश्यकता नहीं है।

उत्तर

10

आप पैटर्न को प्रतिस्थापित करने के लिए इस फ़ंक्शन का उपयोग कर सकते हैं। परीक्षण के लिए आप इसे SQL-Fiddle demo के साथ परीक्षण कर सकते हैं।

CREATE FUNCTION dbo.PatternReplace 
(
    @InputString VARCHAR(4000), 
    @Pattern VARCHAR(100), 
    @ReplaceText VARCHAR(4000) 
) 
RETURNS VARCHAR(4000) 
AS 
BEGIN 
    DECLARE @Result VARCHAR(4000) SET @Result = '' 
    -- First character in a match 
    DECLARE @First INT 
    -- Next character to start search on 
    DECLARE @Next INT SET @Next = 1 
    -- Length of the total string -- 8001 if @InputString is NULL 
    DECLARE @Len INT SET @Len = COALESCE(LEN(@InputString), 8001) 
    -- End of a pattern 
    DECLARE @EndPattern INT 

    WHILE (@Next <= @Len) 
    BEGIN 
     SET @First = PATINDEX('%' + @Pattern + '%', SUBSTRING(@InputString, @Next, @Len)) 
     IF COALESCE(@First, 0) = 0 --no match - return 
     BEGIN 
     SET @Result = @Result + 
      CASE --return NULL, just like REPLACE, if inputs are NULL 
       WHEN @InputString IS NULL 
        OR @Pattern IS NULL 
        OR @ReplaceText IS NULL THEN NULL 
       ELSE SUBSTRING(@InputString, @Next, @Len) 
      END 
     BREAK 
     END 
     ELSE 
     BEGIN 
     -- Concatenate characters before the match to the result 
     SET @Result = @Result + SUBSTRING(@InputString, @Next, @First - 1) 
     SET @Next = @Next + @First - 1 

     SET @EndPattern = 1 
     -- Find start of end pattern range 
     WHILE PATINDEX(@Pattern, SUBSTRING(@InputString, @Next, @EndPattern)) = 0 
      SET @EndPattern = @EndPattern + 1 
     -- Find end of pattern range 
     WHILE PATINDEX(@Pattern, SUBSTRING(@InputString, @Next, @EndPattern)) > 0 
       AND @Len >= (@Next + @EndPattern - 1) 
      SET @EndPattern = @EndPattern + 1 

     --Either at the end of the pattern or @Next + @EndPattern = @Len 
     SET @Result = @Result + @ReplaceText 
     SET @Next = @Next + @EndPattern - 1 
     END 
    END 
    RETURN(@Result) 
END 

Resource link

+0

बहुत बहुत धन्यवाद !, किसी कारण से मैं नहीं देख सकता, जब मैं ब्रैकेट का उपयोग करता हूं [] यह काम नहीं करता है, लेकिन मैं उन्हें कोष्ठक के साथ बदल दूंगा और यह काम कर रहा है। मुझे एसक्यूएल फिडल नहीं पता था, कमाल है !, इसके लिए भी धन्यवाद। – Elwi

+1

देखें [यह] (http://www.sqllion.com/2010/12/pattern-matching-regex-in-t-sql/) ब्रैकेट की व्याख्या! आपका स्वागत है! – Nico

संबंधित मुद्दे