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

标签 sql sql-server sql-server-2008

如何仅将字符串 (12 | 2) & 23 | 中的 2 替换为 1 4 和 25 | (6 | 7)。但不想替换 122325..

中的 2

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

我尝试使用替换子句,但它替换了所有 2

因此仅替换 2 时出现问题。

最佳答案

很久以前我回答了一个可能有帮助的问题:How to strip all non-alphabetic characters from string in 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')

关于SQL:替换字符串中的特定字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19838155/

相关文章:

sql - 用户可以创建但不能执行存储过程

sql-server - SQL Server PDF 全文搜索不适用于 FileStream PDF 文件

SQL Server 占用完整内存后速度完全变慢

sql - 如何在 SQL Server 中以年月日格式显示确切的年龄

mysql - 选择具有最小值的多个列

sql - 从数据库中删除记录的替代方法?

sql - Postgres : delete rows order by without primary key

sql - Postgres WHERE 数组包含空字符串

php - MySql LEFT 连接多个具有相同 ID 或名称的表

python - Django 事务锁定表