2013-01-09 10 views
6

私はこのようないくつかのパターンを交換する必要があり、長いNVARCHAR変数を持っている:SQLでどのようにREPLACE PATTERNを作成できますか?

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

私が見えるように空白ですべて[PAT%]を交換する必要があります。

'Hello stackoverflow world' 

私はどのように行うことができますこれはSQL Server 2008でT-SQLを使用していますか?

私は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

ありがとうございました!何らかの理由で私は見えません。大括弧[]を使用すると機能しませんが、かっこで変更して動作しています。私はSQLのフィドルを知らなかった、素晴らしいです!、それもありがとう。 – Elwi

+1

[this](http://www.sqllion.com/2010/12/pattern-matching-regex-in-t-sql/)括弧の説明を参照してください!どういたしまして! – Nico

関連する問題