MySQL如何在字符串中间插入字符?以邮箱添加+号为例
批量修改邮箱格式的SQL方案
针对users表中类似TestMail20000@gmail.com格式的邮箱,需要在字母与数字之间添加+符号,不同数据库的实现方案如下:
MySQL(8.0及以上版本)
使用REGEXP_REPLACE正则替换函数,精准匹配字母后接数字的位置并插入+:
-- 先验证修改结果(务必先执行此步骤确认) SELECT email, REGEXP_REPLACE(email, '([a-zA-Z])([0-9])', '\\1+\\2') AS new_email FROM users WHERE email REGEXP '[a-zA-Z][0-9]@'; -- 确认无误后执行更新 UPDATE users SET email = REGEXP_REPLACE(email, '([a-zA-Z])([0-9])', '\\1+\\2') WHERE email REGEXP '[a-zA-Z][0-9]@';
说明:WHERE条件过滤出符合字母接数字后带@的邮箱,避免误改其他格式的邮箱。
PostgreSQL
同样使用REGEXP_REPLACE函数,语法略有差异:
-- 先验证修改结果 SELECT email, REGEXP_REPLACE(email, '([a-zA-Z])([0-9])', '\1+\2', 'g') AS new_email FROM users WHERE email ~ '[a-zA-Z][0-9]@'; -- 执行更新 UPDATE users SET email = REGEXP_REPLACE(email, '([a-zA-Z])([0-9])', '\1+\2', 'g') WHERE email ~ '[a-zA-Z][0-9]@';
说明:'g'参数表示全局替换,若邮箱存在多处字母接数字的情况也能处理。
SQL Server
2017及以上版本(支持正则)
-- 先验证修改结果 SELECT email, REGEXP_REPLACE(email, '([a-zA-Z])([0-9])', '$1+$2') AS new_email FROM users WHERE email LIKE '%[a-zA-Z][0-9]@%'; -- 执行更新 UPDATE users SET email = REGEXP_REPLACE(email, '([a-zA-Z])([0-9])', '$1+$2') WHERE email LIKE '%[a-zA-Z][0-9]@%';
旧版本(不支持正则)
使用PATINDEX定位位置,结合STUFF插入+:
-- 先验证修改结果 SELECT email, STUFF(email, PATINDEX('%[a-zA-Z][0-9]@%', email) + 1, 0, '+') AS new_email FROM users WHERE PATINDEX('%[a-zA-Z][0-9]@%', email) > 0; -- 执行更新 UPDATE users SET email = STUFF(email, PATINDEX('%[a-zA-Z][0-9]@%', email) + 1, 0, '+') WHERE PATINDEX('%[a-zA-Z][0-9]@%', email) > 0;
重要提醒
执行更新前必须备份数据,并先运行SELECT语句验证修改结果,确认无误后再执行UPDATE操作,避免数据错误。
内容的提问来源于stack exchange,提问作者ray.one
相关产品推荐
相关产品推荐

