我有一列以全名格式存储数据,例如:
汤姆史密斯
安德鲁·史密斯
是否有一个函数(或函数组合)可以用来将其转换为以下内容:
T·史密斯
A.史密斯
您应该分别存储名字和姓氏。同时:
SELECT CASE WHEN FullName LIKE '% %' THEN
LEFT(FullName, 1) + '.' + SUBSTRING(FullName, CHARINDEX(' ', FullName), 255)
ELSE FullName END
FROM dbo.table;
另一种选择:
SELECT COALESCE(LEFT(FullName, 1)
+ '.' + SUBSTRING(FullName, NULLIF(CHARINDEX(' ', FullName), 0), 255),
FullName)
FROM dbo.table;
这两个都处理单字名称,例如Prince
or Madonna
- 但它们不能正确处理您有中间名的情况。这种情况下的问题将是:
John Wayne Bobbitt
Billy Ray Cyrus
Lisa Van der Wal
Lee Harvey Oswald
Dennis Moseley Williams
James de Caan
您如何确定其中哪些是中间名,哪些具有多字姓氏?如果您正在处理这种情况,请开始更用力地握拳。
Declare @t table(FullName Varchar(100))
Insert Into @t Values('Tom Smith'),('Andrew Smith'),(' Andrew '),('John Wayne Bobbitt'),(NULL)
- 解决方案
SELECT
NewName = CASE WHEN CHARINDEX(' ', LTRIM(RTRIM(FullName))) > 0 THEN LEFT(LTRIM(RTRIM(FullName)),1)
+ '.'
+SUBSTRING((LTRIM(RTRIM(FullName))),CHARINDEX(' ', LTRIM(RTRIM(FullName))),LEN(FullName))
ELSE LTRIM(RTRIM(FullName))
END
FROM @t
//结果
新名字
T. Smith
A. Smith
Andrew
J. Wayne Bobbitt
NULL
这应该有效:
SELECT SUBSTRING(nameCol, 1, 1) + '.' + SUBSTRING(nameCol, CHARINDEX(' ', nameCol), 100)