如何使用SQL Server从客户全名提取带首字母的姓名?
SQL Server 提取带首字母的姓名格式查询
需求:从客户全名中提取「名字及中间名首字母 + 完整姓氏」的格式,示例如下:
- 原全名:
John Cena→ 输出:J Cena - 原全名:
Wathsala Malshani Perera→ 输出:W M Perera
针对数据表的查询语句
假设你的客户表为Customers,存储全名的字段是FullName,可以使用以下查询生成目标格式的姓名:
WITH NameParts AS ( SELECT CustomerId, FullName, value AS NamePart, ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY (SELECT NULL)) AS PartIndex FROM Customers CROSS APPLY STRING_SPLIT(FullName, ' ') WHERE value <> '' -- 过滤拆分后可能出现的空字符串 ) SELECT CustomerId, FullName, -- 拼接首字母部分 + 完整姓氏 CONCAT( STRING_AGG(LEFT(NamePart, 1) + ' ', '') WITHIN GROUP (ORDER BY PartIndex), (SELECT NamePart FROM NameParts np2 WHERE np2.CustomerId = np.CustomerId AND np2.PartIndex = (SELECT MAX(PartIndex) FROM NameParts np3 WHERE np3.CustomerId = np.CustomerId)) ) AS ShortenedName FROM NameParts np GROUP BY CustomerId, FullName;
单条字符串测试示例
如果需要测试单个姓名的转换效果,可以用以下脚本:
DECLARE @FullName NVARCHAR(100) = 'Wathsala Malshani Perera'; WITH NameParts AS ( SELECT value AS NamePart, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS PartIndex FROM STRING_SPLIT(@FullName, ' ') WHERE value <> '' ) SELECT CONCAT( STRING_AGG(LEFT(NamePart, 1) + ' ', '') WITHIN GROUP (ORDER BY PartIndex), (SELECT NamePart FROM NameParts WHERE PartIndex = (SELECT MAX(PartIndex) FROM NameParts)) ) AS ShortenedName;
逻辑说明
- 使用
STRING_SPLIT函数将全名按空格拆分为独立的姓名部分,并用ROW_NUMBER()标记每个部分的顺序 - 通过
STRING_AGG拼接除最后一个部分(姓氏)外所有部分的首字母,每个首字母后添加空格 - 最后拼接上完整的姓氏部分,得到符合要求的姓名格式
注:
STRING_SPLIT函数仅支持SQL Server 2016及以上版本。
内容的提问来源于stack exchange,提问作者delma wax
相关产品推荐
相关产品推荐

