SQL按字符位置拆分Name字段:提取姓、名与中间名首字母
拆分Name字段为FirstName、LastName和MI的SQL方案
针对你现有查询的不足,下面是修改后的SQL代码,能够处理带中间名首字母(含/不含句点)、完整中间名、无中间名以及团体名称的多种格式:
SELECT Name, -- 提取姓氏(LastName) CASE WHEN Name LIKE '%,%' THEN LEFT(Name, CHARINDEX(',', Name) - 1) ELSE Name END AS LastName, -- 提取名字(FirstName):仅截取到逗号后第一个空格前的部分 CASE WHEN Name LIKE '%,%' THEN CASE -- 存在空格时,截取到第一个空格前 WHEN CHARINDEX(' ', Name, CHARINDEX(',', Name) + 2) > 0 THEN SUBSTRING(Name, CHARINDEX(',', Name) + 2, CHARINDEX(' ', Name, CHARINDEX(',', Name) + 2) - (CHARINDEX(',', Name) + 2)) -- 无空格时,直接取逗号后全部内容 ELSE SUBSTRING(Name, CHARINDEX(',', Name) + 2, LEN(Name)) END ELSE Name END AS FirstName, -- 提取中间名首字母(MI):去除句点,无中间名则返回NULL CASE WHEN Name LIKE '%,%' AND CHARINDEX(' ', Name, CHARINDEX(',', Name) + 2) > 0 THEN REPLACE(LEFT(SUBSTRING(Name, CHARINDEX(' ', Name, CHARINDEX(',', Name) + 2) + 1, LEN(Name)), 1), '.', '') ELSE NULL END AS MI FROM Customer
逻辑说明
- LastName:如果Name包含逗号,直接取逗号前的内容作为姓氏;无逗号则保留原字段(对应团体名称或名在前的个人)。
- FirstName:针对带逗号的格式,先定位逗号后的第一个空格:
- 有空格时,截取逗号后到该空格前的内容作为名字;
- 无空格时,说明没有中间名,直接取逗号后全部内容作为名字。
- MI:仅当存在中间名部分(即逗号后有空格)时,提取空格后内容的首字母,并自动去除可能的句点;无中间名时返回NULL。
测试示例
| Name | LastName | FirstName | MI |
|---|---|---|---|
| Doe, John A. | Doe | John | A |
| Smith, Bob | Smith | Bob | NULL |
| Wilson, Alice Marie | Wilson | Alice | M |
| XYZ Corporation | XYZ Corporation | XYZ Corporation | NULL |
内容的提问来源于stack exchange,提问作者user3691608
相关产品推荐
相关产品推荐

