我正在尝试使用我从Stack Overflow中的某人处获得的这个sql代码来拆分Fullname,但是它不起作用,因为Fullname的格式就像这个“LastName,FirstName Middle Initial”并且有名字没有中间名首字母。
select left(m.fullname, CHARINDEX(' ', m.fullname)) as [Last Name]
,substring(m.fullname, CHARINDEX(' ', m.fullname)+1
,len(m.fullname)-(CHARINDEX(' ', m.fullname)-1)) as [First Name]
From Temp
有人可以告诉我如何查询。示例格式如下:
FullName: Smith, John D
期望的输出:
LastName FirstName
Smith John
提前谢谢
答案 0 :(得分:1)
使用逗号分割字符串。结果应该是一个数组。索引零将是姓氏,索引1将是名字。
答案 1 :(得分:1)
在数据库中将“全名”解析为名字,中间名和姓氏并不简单。不要尝试,除非这只是一个考虑简化的非现实生活案例的作业。
解析全名需要非平凡的逻辑来识别各种情况。有几个原因:
当然,所有上述操作都可以使用SQL完成。但是,SQL不是恕我直言的正确选择。
答案 2 :(得分:1)
您可以使用parsename()
功能:
select fullname, parsename(replace(fullname, ' ', '.'), 3) as lastname,
parsename(replace(fullname, ' ', '.'), 2) as firstname
from table t;
答案 3 :(得分:1)
除了The Impaler的答案之外,还可以回答如何拆分FullName。这不能解决命名规则中解释得很好的问题,但是 - 至少 - 你会以结构化的格式获得每个部分:
DECLARE @mockup TABLE(ID INT IDENTITY, FullName NVARCHAR(500));
INSERT INTO @mockup VALUES(N'Smith, John D')
,(N'Parker, Dr. James');
SELECT CAST(N'<x><y>'
+ REPLACE(
REPLACE(
(SELECT FullName AS [*] FOR XML PATH(''))
,N','
,N'</y></x><x><y>'
)
,N' '
,N'</y><y>')
+ N'</y></x>' AS XML)
.query(
N'
for $x in /x
return
<x>
{
for $y in $x/y[text()]
return $y
}
</x>
'
)
FROM @mockup;
名字的结果
<x>
<y>Smith</y>
</x>
<x>
<y>John</y>
<y>D</y>
</x>
第二次
<x>
<y>Parker</y>
</x>
<x>
<y>Dr.</y>
<y>James</y>
</x>
您可以看到,逗号分隔的部分位于<x>
内,而空白的分隔部分则是嵌套的<y>
。