You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)会返回第一个匹配前缀的起始位置,如果姓名开头就是这些前缀,返回值为1
  • SUBSTRING(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;

输出结果:

OriginalNameCleanedName
Mr. Andy J JonesAndy J Jones
Ms. Sarah D LeeSarah D Lee
Miss Sarah D LeeSarah D Lee
John SmithJohn Smith
Mr.XYZMr.XYZ
Mississippi AnneMississippi Anne

额外小贴士

  1. 处理多空格情况:如果你的数据中前缀和姓名之间可能有多个空格,可以在STUFF之后加LTRIM,比如LTRIM(STUFF(...)),确保清理后的姓名开头没有多余空格
  2. 更新表数据:如果需要直接修改表中的姓名字段,可以把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:16:38