在 SQL 中拆分全名



我正在尝试用我在堆栈溢出中从某人那里得到的这个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>

最新更新