我正在尝试用我在堆栈溢出中从某人那里得到的这个sql代码拆分全名,但它不起作用,因为全名的格式就像这个"姓氏,名字中间名首字母",有些名字没有中间名首字母。
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
提前谢谢你
使用逗号拆分字符串。结果应该是一个数组。索引零将是姓氏,索引 1 将是名字。
您可以使用parsename()
函数:
select fullname, parsename(replace(fullname, ' ', '.'), 3) as lastname,
parsename(replace(fullname, ' ', '.'), 2) as firstname
from table t;
在数据库中将"全名"解析为名字、中间名和姓氏并不简单。不要尝试,除非这只是考虑简化的非现实生活案例的家庭作业。
解析全名需要不平凡的逻辑来识别各种情况。有几个原因:
- 大多数语言都有多单词的名字和姓氏。它们不像美国那样连字符,但它们每个都包含真正的多个单词。甚至一些美国(很少(的名字也有多个单词。
- 有些人有中间名或根本没有中间名。
- 有些人在名称中包含后缀:
- "Jr","Sr"是赞助的。
- "博士","绅士"是头衔。
- 有更复杂的案例传达不同类型的信息。
- 在某些语言中,名字和姓氏是颠倒的。以韩语为例。
- 您需要考虑名称可以包含特殊字符:例如"O'Hara"。几乎任何东西都是有效的,这取决于语言。
- 您需要考虑使用 unicode,以正确识别字母符号。法国人吗?俄语?普通话?
- 最后,您需要考虑无数的特殊情况。也就是说,您需要一个知识库来解决各种情况,而您将使用的"正常"规则不会涵盖这些情况。
当然,以上所有操作都可以使用 SQL 来完成。但是,恕我直言,SQL不是正确的选择。
除了The Impaler的答案之外,这里还有一个如何拆分全名的答案。这不会解决命名规则很好地解释的问题,但是 - 至少 - 您可以以结构格式获得每个部分:
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>
。