SQL Server如何在字符串首次出现signal的位置前动态插入点号
需求说明
现有数据表中Test1列存储字符串类型记录,需要对字段值做统一批量更新:
- 以子串
signal首次出现的位置为标识,在该子串前方插入英文点号. - 即使同一条记录中
signal多次出现,也仅在第一次出现的位置前插入一次点号
原始数据样例:
123ABCsignal2342 23ABsignal234signal ABBSDsignal2signal
目标更新结果:
123ABC.signal2342 23AB.signal234signal ABBSD.signal2signal
实现方案
核心逻辑无需使用复杂正则,直接通过数据库内置字符串函数定位signal第一次出现的下标,将原字符串拆分为「下标前子串」+.+「下标位置到末尾子串」三段拼接即可,天然仅处理第一次匹配的位置,不会干扰后续重复出现的signal内容。
注意:执行更新前务必备份原表数据,可先执行SELECT语句预览处理结果,确认无误后再执行更新操作
以下为不同常用数据库的可直接执行的语句:
MySQL / MariaDB
使用LOCATE()函数做子串定位,语句如下:-- 预览结果用 SELECT Test1 AS 原始值, CONCAT(LEFT(Test1, LOCATE('signal', Test1) - 1), '.', SUBSTRING(Test1, LOCATE('signal', Test1))) AS 处理后值 FROM 你的表名 WHERE Test1 LIKE '%signal%'; -- 确认结果正确后执行更新 UPDATE 你的表名 SET Test1 = CONCAT( LEFT(Test1, LOCATE('signal', Test1) - 1), '.', SUBSTRING(Test1, LOCATE('signal', Test1)) ) WHERE Test1 LIKE '%signal%';SQL Server
使用CHARINDEX()函数做子串定位,语句如下:-- 预览结果用 SELECT Test1 AS 原始值, CONCAT(LEFT(Test1, CHARINDEX('signal', Test1) - 1), '.', SUBSTRING(Test1, CHARINDEX('signal', Test1), LEN(Test1))) AS 处理后值 FROM 你的表名 WHERE Test1 LIKE '%signal%'; -- 确认结果正确后执行更新 UPDATE 你的表名 SET Test1 = CONCAT( LEFT(Test1, CHARINDEX('signal', Test1) - 1), '.', SUBSTRING(Test1, CHARINDEX('signal', Test1), LEN(Test1)) ) WHERE Test1 LIKE '%signal%';PostgreSQL
使用POSITION()函数做子串定位,语句如下:-- 预览结果用 SELECT Test1 AS 原始值, LEFT(Test1, POSITION('signal' IN Test1) - 1) || '.' || SUBSTRING(Test1 FROM POSITION('signal' IN Test1)) AS 处理后值 FROM 你的表名 WHERE Test1 LIKE '%signal%'; -- 确认结果正确后执行更新 UPDATE 你的表名 SET Test1 = LEFT(Test1, POSITION('signal' IN Test1) - 1) || '.' || SUBSTRING(Test1 FROM POSITION('signal' IN Test1)) WHERE Test1 LIKE '%signal%';Oracle
使用INSTR()函数做子串定位,语句如下:-- 预览结果用 SELECT Test1 AS 原始值, SUBSTR(Test1, 1, INSTR(Test1, 'signal') - 1) || '.' || SUBSTR(Test1, INSTR(Test1, 'signal')) AS 处理后值 FROM 你的表名 WHERE INSTR(Test1, 'signal') > 0; -- 确认结果正确后执行更新 UPDATE 你的表名 SET Test1 = SUBSTR(Test1, 1, INSTR(Test1, 'signal') - 1) || '.' || SUBSTR(Test1, INSTR(Test1, 'signal')) WHERE INSTR(Test1, 'signal') > 0;
内容的提问来源于stack exchange,提问作者tommy74
相关产品推荐
相关产品推荐

