场景
1.替换字段中全部匹配的字符串
2.替换指定位置的字符串,如匹配目标字符串的第一个,或者最后一个替换
方法
1.REPLACE替换全部匹配内容
REPLACE(string_expression, string_pattern, string_replacement)
参数:
string_expression 要搜索的字符串表达式
string_pattern 是要查找的子字符串
string_replacement 替换字符串
2.STUFF删除指定长度的字符,并在指定的起点处插入另一组字符
STUFF(string_expression1, start, length, string_expression2)
参数:
string_expression1 要搜索的字符串表达式
start 删除开始位(>=1)
length 删除长度
string_expression2 插入字符串
Demo
目标数据库如下
需求1:替换所有PersonId和PersonName中的1414030230和张三 替换为 2021和王加油
select F_Id,F_PersonId,REPLACE(F_PersonId,'1414030230','2020'),
F_PersonName,REPLACE(F_PersonName,N'张三',N'王加油') from TempPerson
需求2:替换第一个匹配的数据
--CHARINDEX:匹配的字符串起始位置,没有匹配的数据返回值为0
--len:字符串长度
select F_Id,F_PersonId,
STUFF(F_PersonId,CHARINDEX('1414030230',F_PersonId),len('1414030230'),'2020'),
F_PersonName,
STUFF(F_PersonName,CHARINDEX(N'张三',F_PersonName),len(N'张三'),'王加油')
from TempPerson
需求3:替换最后一个匹配的数据
--REVERSE:字符串倒转
select F_Id,F_PersonId,
REVERSE(STUFF(REVERSE(F_PersonId),CHARINDEX(REVERSE('1414030230'),REVERSE(F_PersonId)),len('1414030230'),REVERSE('2020'))),
F_PersonName,
REVERSE(STUFF(REVERSE(F_PersonName),CHARINDEX(REVERSE(N'张三'),REVERSE(F_PersonName)),len(N'张三'),REVERSE(N'王加油')))
from TempPerson
从上面两个示例中可看出,有的数据替换为NULL,这是因为CHARINDEX方法没有找到匹配的字符串时返回值为0,STUFF方法替换开始位需要大于0,等于0时,返回内容为NULL,所以在实际使用STUFF中,避免产生NULL,需要加上where条件筛选到想要的数据再使用STUFF替换。