SQL Server中为逗号分隔字符串按规则添加百分号的实现方法
在SQL Server中为逗号分隔字符串的数字前缀添加百分号格式
场景说明
你的数据是某列中以逗号分隔的子串,每个子串开头的数字代表百分比(0-100),需要将数字后添加% ,把类似48FGTG的格式转为48% FGTG。
方法1:使用正则表达式替换(SQL Server 2017及以上版本)
SQL Server 2017及之后支持REGEXP_REPLACE函数,直接通过正则匹配每个子串开头的数字部分,替换为带百分号的格式:
UPDATE 你的表名 SET 目标列名 = REGEXP_REPLACE(目标列名, '(\d+)([A-Za-z]+)', '$1% $2', 1, 0, 'i')
正则说明
(\d+):匹配子串开头的1到多个数字(对应百分比数值),作为第一个捕获组([A-Za-z]+):匹配数字后的字母部分,作为第二个捕获组$1% $2:将匹配到的内容替换为“数字+%+空格+字母部分”'i':忽略大小写,确保大小写字母都能匹配
方法2:兼容旧版本(SQL Server 2016及以下)
旧版本没有正则和STRING_AGG,需要通过字符串拆分、逐元素处理、再合并的方式实现:
步骤1:拆分字符串
使用STRING_SPLIT(SQL Server 2016及以上)将逗号分隔的字符串拆分为行:
SELECT t.主键列, s.value AS 原始子串 FROM 你的表名 t CROSS APPLY STRING_SPLIT(t.目标列名, ',') s
步骤2:处理每个子串
通过字符串函数提取数字和字母部分,拼接成目标格式:
SELECT 主键列, CONCAT( LEFT(原始子串, PATINDEX('%[^0-9]%', 原始子串) - 1), '% ', RIGHT(原始子串, LEN(原始子串) - PATINDEX('%[^0-9]%', 原始子串) + 1) ) AS 处理后子串 FROM ( SELECT t.主键列, s.value AS 原始子串 FROM 你的表名 t CROSS APPLY STRING_SPLIT(t.目标列名, ',') s ) AS temp
步骤3:合并处理后的子串
使用FOR XML PATH合并回逗号分隔的字符串,完成更新:
WITH 处理后的子串 AS ( SELECT t.主键列, CONCAT( LEFT(s.value, PATINDEX('%[^0-9]%', s.value) - 1), '% ', RIGHT(s.value, LEN(s.value) - PATINDEX('%[^0-9]%', s.value) + 1) ) AS 子串 FROM 你的表名 t CROSS APPLY STRING_SPLIT(t.目标列名, ',') s ) UPDATE t SET t.目标列名 = STUFF(( SELECT ',' + 子串 FROM 处理后的子串 s WHERE s.主键列 = t.主键列 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM 你的表名 t
注意事项
- 如果子串开头的数字包含前导零(比如
07EWR),上述方法会保留前导零,符合需求 - 确保表中有主键列用于关联拆分和合并的行
- 测试时建议先使用
SELECT语句验证结果,再执行UPDATE
内容的提问来源于stack exchange,提问作者Olivarsham
相关产品推荐
相关产品推荐

