我很久以前回答了一个可能有帮助的问题: 如何从 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
基本上,此代码搜索 {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
您可以像这样测试/使用该功能:
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')