SQL Server及SSMS中如何将全名字段拆分为名和姓两列
SQL Server 拆分全名字段为名字、姓氏列实现方案
拆分规则以第一个空格为分隔边界:空格前的内容存入名字(First Name)列,空格后的所有剩余内容存入姓氏(Surname)列,完全匹配Jonathon Smith Roberts拆分为Jonathon/Smith Roberts的需求,所有写法兼容全版本SQL Server,可直接在SSMS中执行。
场景1:查询时临时拆分(不修改原表数据)
直接在SELECT语句中通过内置函数计算拆分结果,适合临时导出、查询展示场景,代码做了无空格、多空格的边界兼容,不会出现语法报错:
SELECT 全名字段, FirstName = CASE WHEN CHARINDEX(' ', TRIM(全名字段)) > 0 THEN LEFT(TRIM(全名字段), CHARINDEX(' ', TRIM(全名字段)) - 1) ELSE TRIM(全名字段) END, Surname = CASE WHEN CHARINDEX(' ', TRIM(全名字段)) > 0 THEN LTRIM(SUBSTRING(TRIM(全名字段), CHARINDEX(' ', TRIM(全名字段)), LEN(全名字段))) ELSE '' END FROM 你的业务表名;
场景2:新增持久化列存储拆分结果
如果需要把拆分结果固定存在表中,可先新增两列,再批量更新数据:
-- 新增名字、姓氏列,可根据实际业务调整字段长度 ALTER TABLE 你的业务表名 ADD FirstName VARCHAR(100), Surname VARCHAR(200); -- 批量写入拆分后的数据 UPDATE 你的业务表名 SET FirstName = CASE WHEN CHARINDEX(' ', TRIM(全名字段)) > 0 THEN LEFT(TRIM(全名字段), CHARINDEX(' ', TRIM(全名字段)) - 1) ELSE TRIM(全名字段) END, Surname = CASE WHEN CHARINDEX(' ', TRIM(全名字段)) > 0 THEN LTRIM(SUBSTRING(TRIM(全名字段), CHARINDEX(' ', TRIM(全名字段)), LEN(全名字段))) ELSE '' END;
注意事项
- 代码中加入
TRIM、LTRIM处理,可自动兼容全名字段前后带多余空格、名字和姓氏之间有多个连续空格的脏数据场景 - 无空格的异常姓名数据会自动将完整值存入FirstName列,Surname列留空,不会出现更新报错
- 如果业务数据中存在姓名前缀带尊称(Mr、Ms、Dr等)的情况,可在拆分前先通过REPLACE函数替换掉前缀尊称,避免拆分结果错误
效果验证:输入值
Jonathon Smith Roberts,拆分后FirstName返回Jonathon,Surname返回Smith Roberts,符合预期。
内容的提问来源于stack exchange,提问作者user19129062
相关产品推荐
相关产品推荐

