2017-03-21 12 views
0

を置き換える:SQLは、私はこのようなものが含まれているSQL Server 2005のデータベースのレコード持っ

longlongLongText###abcdefg###longlongLongText 

(それは各レコード内の異なる文字にすることができ、多かれ少なかれ手紙かもしれないパターンを### abcdefg ###は長い文字列の一部になります)

最初の3文字しか残さないようにレコードを更新したいと思います。結果は

longlongLongText###abc###longlongLongText 

可能でしょうか?

ありがとうございました。

+1

は、それは常に最後に3つの先頭にシャープと3を持っていますか? – oryol

+0

はい。常に3 ###。 –

+2

はい、可能です。 – jarlh

答えて

0

これで試してみてください:

"col1"を列名に置き換えます。

update yourtable 
     SET col1 = substring(col1,0,charindex('###',col1)-1)+substring(col1,charindex('###',col1),6)+ substring(col1,CHARINDEX('###',col1,(charindex('###',col1)+1)), (len(col1)-CHARINDEX('###',col1,(charindex('###',col1))))) 

hereあなたは

希望を参照し、テストすることができ、このヘルプ

1

これは必要な操作ですか?

select left(str, 6) + '###' 

または代わり:中央に1つまたは2つの文字がある場合、

select '###' + left(replace(str, '#', ''), 3) + '###' 

これは良い仕事します。

+1

7ではなく6になりますか? –

2

これは動作するはずです:

Update YourTable 

Set YourField = left(YourField,CHARINDEX('###', YourField)-1) + substring(YourField, CHARINDEX('###', YourField),6) + right(YourField, len(YourField) - CHARINDEX('###', YourField) - 8) 

where CHARINDEX('###', YourField)>0 

それが到達するまで-The左関数は、あなたの長い文字列の左側の一部が返されます「###」

-The substring関数から始まる部分文字列を返します。最初の '###'はあなたの最初の3人のキャラクターを含んでいます。

-the右の機能が第二から始まるサブストリング右を返します '###'

をあなたはここでそれを試すことができます:Fiddle

+0

しかし、それは長い文字列の一部です。私はちょうど左6を保ちたくない。 –

+1

あなたはシャープの後に最初の3文字を残しておきたいと言ったので、3つのシャープと3つの文字は6です。 –

+1

それは本当ですが、「長い文字列の一部になるでしょう。 –

0

は、以下のような簡単な関数を作成します。

create function fnReplaceByPattern(@s varchar(max)) returns varchar(max) 
begin 
    declare @pos int = 1; 
    declare @len int = len(@s); 

    declare @result varchar(max) = ''; 

    while @pos < @len 
    begin 
     declare @start int = charindex('###', @s, @pos); 
     declare @end int = charindex('###', @s, @start + 3); 

     if @start != 0 and @end != 0 
     begin 
      set @result += substring(@s, @pos, @start - @pos + 6) + '###'; 
      set @pos = @end + 3; 
     end 
     else 
     begin 
      set @result += substring(@s, @pos, @len - @pos + 1); 
      set @pos = @len; 
     end 
    end 

    return @result 
end

使用してくださいupdate T1 set Data = dbo.fnReplaceByPattern(Data)

関連する問題