我有一个列以全名格式存储数据,例如:
汤姆史密斯Andrew Smith
是否有一个函数(或函数组合)可用于将其转换为以下内容:
吨。史密斯
一个。史密斯
答案 0 :(得分:5)
你应该分别存储名字和姓氏。与此同时:
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
或Madonna
这样的单字名称,但它们无法正确处理您拥有中间名称的情况。那种情况下的问题是:
John Wayne Bobbitt
Billy Ray Cyrus
Lisa Van der Wal
Lee Harvey Oswald
Dennis Moseley Williams
James de Caan
如何确定哪些是中间名,哪些是多字姓?如果你正在处理这种情况,那就开始更加努力地摇动你的拳头了。
答案 1 :(得分:1)
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
答案 2 :(得分:0)
这应该有效:
SELECT SUBSTRING(nameCol, 1, 1) + '.' + SUBSTRING(nameCol, CHARINDEX(' ', nameCol), 100)