SQL Server 替换

场景

  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替换。

SQL Server中用于字符串替换的函数是`REPLACE()`。该函数可以将字符串中的特定子字符串替换为另一个指定字符串。其语法如下: ```sql REPLACE (string_expression1, string_expression2, string_expression3) ``` - `string_expression1` 是待搜索的原始字符串表达式。 - `string_expression2` 是要在原始字符串中查找的子字符串表达式。 - `string_expression3` 是用来替换找到的子字符串的新字符串表达式[^1]。 例如,如果想要将字符串SQL SERVER”中的“ER”替换为“AA”,可以使用以下SQL语句: ```sql SELECT REPLACE('SQL SERVER', 'ER', 'AA') AS 替换结果 ``` 这将会返回一个新的字符串,其中所有的“ER”都被替换成了“AA”。 当需要在表中的某一列进行批量替换时,可以使用`UPDATE`语句结合`REPLACE()`函数来实现。比如,假设有一个名为`flash`的表,其中有一个`url`字段,现在想把所有`url`字段值里的`game.网址.com/不变部分`替换为`game_new.网址.com/不变部分`,可以使用如下SQL语句: ```sql UPDATE flash SET url = REPLACE(url, 'game', 'game_new') ``` 或者更具体地指定替换的位置: ```sql UPDATE flash SET url = REPLACE(url, SUBSTRING(url, 1, 4), 'game_new') ``` 这样就可以仅替换URL中的前缀部分,而不影响后面保持不变的部分[^2]。 对于多层分类显示样式的处理,还可以利用`REPLICATE()`函数与`REPLACE()`函数相结合的方法,以生成具有层级结构的字符串。例如,给定一个分类ID路由如`1-2-3`,可以通过计算破折号的数量来决定缩进级别,并用相应的数量的特殊字符(如'└')进行替换,从而形成美观的分类展示效果[^3]。 ### 使用示例 下面是一些具体的使用示例: #### 示例一:简单替换 ```sql -- 将名字'张三'中的'三'替换为'四' SELECT REPLACE('张三', '三', '四') AS 结果; ``` #### 示例二:复杂替换 ```sql -- 假设有一个分类路径为'数码产品>手机>小米' -- 我们希望将其转换成带有缩进样式的分类名称 -- 首先定义变量 DECLARE @CategoryPath NVARCHAR(255) = '数码产品>手机>小米'; -- 计算层级深度并创建缩进样式 SELECT REPLICATE('└', LEN(@CategoryPath) - LEN(REPLACE(@CategoryPath, '>', ''))) + '小米' AS 缩进样式; ``` 通过这些例子可以看出,`REPLACE()`函数非常灵活且强大,在数据清洗和格式化过程中扮演着重要角色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-小龙人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值