SQL:从字符串中替换特定字符

Par*_*tel 2 sql sql-server sql-server-2008

如何只21字符串替换(12 | 2) & 23 | 4 & 25 | (6 | 7).但不希望更换2它们中12,23,25...

因为我不知道,有多少2是字符串.所以我只想替换2.

我尝试使用replace子句但它取代了所有2.

所以在更换时出现问题2.

G M*_*ros 5

很久以前我回答了一个问题,可能会有所帮助: 如何从SQL Server中的字符串中删除所有非字母字符?

在那个问题中,我展示了一段在这里也很有帮助的代码(当然还有修改).

 Declare @Temp VarChar(100)
 Set @Temp = '(12 | 2) & 23 | 4 & 25 | (6 | 7)'

 Declare @FindCharacter VarChar(10),
        @ReplaceCharacter VarChar(10)

Set @FindCharacter = '2'
Set @ReplaceCharacter = '1'

 While PATINDEX('%[^0-9]' + @FindCharacter + '[^0-9]%', @Temp) > 0
    Set @Temp = Stuff(@Temp, PATINDEX('%[^0-9]' + @FindCharacter + '[^0-9]%', @Temp) + 1, Len(@FindCharacter), @ReplaceCharacter)

Select @Temp
Run Code Online (Sandbox Code Playgroud)

基本上,此代码搜索{not a number} {value 2} {not a number}.这也意味着如果代码是字符串的第一个或最后一个字符,代码将不会替换2.这里的"替换"实际上是通过STUFF功能完成的.由于STUFF一次只能替换一个字符串,因此需要while循环才能使其多次替换.

这是一个用于替换的标量UDF.它将适应替换,即使它们位于搜索字符串的开头或结尾.

Create Function dbo.ReplaceNumber(@Input VarChar(100), @Find VarChar(10), @Replace VarChar(10))
Returns VarChar(100)
AS
Begin

    Set @Input = '~' + @Input + '~'

    While PATINDEX('%[^0-9]' + @Find + '[^0-9]%', @Input) > 0
        Set @Input = Stuff(@Input, PATINDEX('%[^0-9]' + @Find + '[^0-9]%', @Input) + 1, Len(@Find), @Replace)

    Return SubString(@Input, 2, Len(@Input)-2)
End
Run Code Online (Sandbox Code Playgroud)

你可以像这样测试/使用这个函数:

Select dbo.ReplaceNumber('(12 | 2) & 23 | 4 & 25 | (6 | 7)','2','1')
Select dbo.ReplaceNumber('2 & 23','2','1')
Select dbo.ReplaceNumber('2 & 23','23','10')
Run Code Online (Sandbox Code Playgroud)