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

SQL Server中将单列拆分为多列的实现方法咨询

拆分Employee表的FullName列为LastName、FirstName和MiddleName

嘿,作为SQL初学者碰到这种字符串拆分的问题很正常,我来一步步给你讲清楚怎么操作,保证你能跟着做明白:


第一步:添加新列

不管你用哪种数据库,先给表加上三个用来存储拆分后数据的列:

ALTER TABLE Employee
ADD LastName VARCHAR(100),
    FirstName VARCHAR(100),
    MiddleName VARCHAR(100);

这里的VARCHAR(100)可以根据你实际的名字长度调整,改成VARCHAR(255)会更稳妥。


第二步:填充拆分后的数据

我会针对两种常见数据库给出具体命令,你可以根据自己使用的数据库选择:

如果用SQL Server

我们分两步提取数据:先拿逗号前面的姓氏,再处理逗号后面的名和中间名:

  1. 提取LastName:
UPDATE Employee
SET LastName = TRIM(SUBSTRING(FullName, 1, CHARINDEX(',', FullName) - 1));
  • CHARINDEX(',', FullName):找到逗号在字符串里的位置
  • SUBSTRING:截取从开头到逗号前一位的内容
  • TRIM:去掉前后可能存在的多余空格
  1. 提取FirstName和MiddleName:
UPDATE Employee
SET FirstName = TRIM(SUBSTRING(NamePart, 1, CHARINDEX(' ', NamePart + ' ') - 1)),
    MiddleName = TRIM(SUBSTRING(NamePart, CHARINDEX(' ', NamePart + ' ') + 1, LEN(NamePart)))
FROM (
    -- 先把逗号后面的名字部分单独提取出来
    SELECT FullName, SUBSTRING(FullName, CHARINDEX(',', FullName) + 1, LEN(FullName)) AS NamePart
    FROM Employee
) AS Temp;

这里给NamePart拼接了一个空格NamePart + ' ',是为了避免有些人没有中间名时,CHARINDEX找不到空格导致报错——这种情况下MiddleName会变成空字符串,你可以根据需求调整为NULL。

如果用MySQL

MySQL的SUBSTRING_INDEX函数处理这种分隔字符串更简单:

  1. 提取LastName:
UPDATE Employee
SET LastName = TRIM(SUBSTRING_INDEX(FullName, ',', 1));
  • SUBSTRING_INDEX(FullName, ',', 1):直接截取第一个逗号前面的内容
  1. 提取FirstName和MiddleName:
UPDATE Employee
SET FirstName = TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(FullName, ',', -1), ' ', 1)),
    MiddleName = TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(FullName, ',', -1), ' ', -1));
  • SUBSTRING_INDEX(FullName, ',', -1):先拿到逗号后面的所有内容
  • 再用空格拆分,第一个部分是FirstName,最后一个部分是MiddleName

第三步:(可选)删除原FullName列

等你确认所有数据都拆分正确后,可以删掉原来的FullName列:

ALTER TABLE Employee
DROP COLUMN FullName;

小提示:操作前最好先备份表,或者用SELECT语句先测试拆分结果,比如SQL Server可以先运行这个验证:

SELECT
    FullName,
    TRIM(SUBSTRING(FullName, 1, CHARINDEX(',', FullName) - 1)) AS LastName,
    TRIM(SUBSTRING(NamePart, 1, CHARINDEX(' ', NamePart + ' ') - 1)) AS FirstName,
    TRIM(SUBSTRING(NamePart, CHARINDEX(' ', NamePart + ' ') + 1, LEN(NamePart))) AS MiddleName
FROM (
    SELECT FullName, SUBSTRING(FullName, CHARINDEX(',', FullName) + 1, LEN(FullName)) AS NamePart
    FROM Employee
) AS Temp;

内容的提问来源于stack exchange,提问作者user3289917

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:38:28