如何在SQL Server中按需去除Mr.、Ms.或Miss前缀
如何在SQL Server中移除姓名的Mr.、Ms.或Miss前缀(仅当存在时)
嘿,这个需求我熟!要在SQL Server里只移除姓名开头的Mr.、Ms.或Miss前缀,而且只有当这些前缀存在的时候才动手,咱们可以用字符串函数组合出几种靠谱的实现方式,我给你一步步拆解:
方法一:用CASE WHEN精准匹配前缀
这种方法逻辑直白,适合前缀不多的场景,能精准控制每种前缀的处理:
SELECT OriginalName, CASE -- 匹配"Mr. "开头的姓名,移除前4个字符(包括空格) WHEN OriginalName LIKE 'Mr. %' THEN STUFF(OriginalName, 1, 4, '') -- 匹配"Ms. "开头的姓名,同样移除前4个字符 WHEN OriginalName LIKE 'Ms. %' THEN STUFF(OriginalName, 1, 4, '') -- 匹配"Miss "开头的姓名,移除前5个字符(Miss+空格) WHEN OriginalName LIKE 'Miss %' THEN STUFF(OriginalName, 1, 5, '') -- 没有匹配到任何前缀,返回原姓名 ELSE OriginalName END AS CleanedName FROM YourTableName;
代码解释:
CASE WHEN逐个判断姓名是否以目标前缀(注意前缀后面的空格,避免误处理Mr.XYZ这种没有空格的字符串)开头STUFF函数用来“删掉”前缀部分:它会从原字符串的第1位开始,替换掉指定长度的字符(这里是前缀+空格的长度)为空白,相当于直接移除这部分- 没有匹配到前缀的姓名会原样返回,不会被修改
方法二:用PATINDEX简化多前缀判断
如果觉得多个WHEN有点繁琐,可以用PATINDEX一次性匹配所有前缀模式,代码更简洁:
SELECT OriginalName, CASE -- 检查姓名是否以任意目标前缀开头 WHEN PATINDEX('(Mr. |Ms. |Miss )%', OriginalName) = 1 THEN STUFF(OriginalName, 1, LEN(SUBSTRING(OriginalName, 1, PATINDEX(' %', OriginalName))), '') ELSE OriginalName END AS CleanedName FROM YourTableName;
代码解释:
PATINDEX('(Mr. |Ms. |Miss )%', OriginalName)会返回第一个匹配前缀的起始位置,如果姓名开头就是这些前缀,返回值为1SUBSTRING(OriginalName, 1, PATINDEX(' %', OriginalName))会取出从开头到第一个空格的部分(也就是前缀),再用LEN获取它的长度- 最后用
STUFF移除这部分前缀,得到清理后的姓名
测试示例(验证效果)
我准备了一些测试数据,你可以直接跑一下看看效果:
DECLARE @Names TABLE (OriginalName VARCHAR(100)); INSERT INTO @Names VALUES ('Mr. Andy J Jones'), ('Ms. Sarah D Lee'), ('Miss Sarah D Lee'), ('John Smith'), -- 无前缀的姓名 ('Mr.XYZ'), -- 前缀后没有空格,不会被处理 ('Mississippi Anne'); -- 包含"Miss"但不是前缀,不会被处理 -- 用方法一测试 SELECT OriginalName, CASE WHEN OriginalName LIKE 'Mr. %' THEN STUFF(OriginalName, 1, 4, '') WHEN OriginalName LIKE 'Ms. %' THEN STUFF(OriginalName, 1, 4, '') WHEN OriginalName LIKE 'Miss %' THEN STUFF(OriginalName, 1, 5, '') ELSE OriginalName END AS CleanedName FROM @Names;
输出结果:
| OriginalName | CleanedName |
|---|---|
| Mr. Andy J Jones | Andy J Jones |
| Ms. Sarah D Lee | Sarah D Lee |
| Miss Sarah D Lee | Sarah D Lee |
| John Smith | John Smith |
| Mr.XYZ | Mr.XYZ |
| Mississippi Anne | Mississippi Anne |
额外小贴士
- 处理多空格情况:如果你的数据中前缀和姓名之间可能有多个空格,可以在
STUFF之后加LTRIM,比如LTRIM(STUFF(...)),确保清理后的姓名开头没有多余空格 - 更新表数据:如果需要直接修改表中的姓名字段,可以把SELECT改成UPDATE,并且加上WHERE条件只更新有前缀的记录,效率更高:
UPDATE YourTableName SET OriginalName = CASE WHEN OriginalName LIKE 'Mr. %' THEN STUFF(OriginalName, 1, 4, '') WHEN OriginalName LIKE 'Ms. %' THEN STUFF(OriginalName, 1, 4, '') WHEN OriginalName LIKE 'Miss %' THEN STUFF(OriginalName, 1, 5, '') ELSE OriginalName END WHERE OriginalName LIKE 'Mr. %' OR OriginalName LIKE 'Ms. %' OR OriginalName LIKE 'Miss %';
内容的提问来源于stack exchange,提问作者user1030181
相关产品推荐
相关产品推荐

