在SQL中拆分FullName

时间:2018-06-05 17:14:33

标签: sql sql-server tsql

我正在尝试使用我从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

提前谢谢

4 个答案:

答案 0 :(得分:1)

使用逗号分割字符串。结果应该是一个数组。索引零将是姓氏,索引1将是名字。

答案 1 :(得分:1)

在数据库中将“全名”解析为名字,中间名和姓氏并不简单。不要尝试,除非这只是一个考虑简化的非现实生活案例的作业。

解析全名需要非平凡的逻辑来识别各种情况。有几个原因:

  • 大多数语言都有多个单词的名字和姓氏。它们不像美国那样用连字符表示,但它们各自包括真正的多个单词。甚至一些美国(很少)的名字也有多个词。
  • 有些人有中间名或根本没有。
  • 有些人将后缀作为其名称的一部分:
    • “Jr”,“Sr”是赞助人。
    • “PhD”,“Esquire”是标题。
    • 有更复杂的案例传达不同类型的信息。
  • 在某些语言中,名字和姓氏都是倒置的。韩国人。例如。
  • 您需要考虑名称可以包含特殊字符:例如“O'Hara”。几乎所有东西都可以有效,具体取决于语言。
  • 您需要考虑使用unicode,才能正确识别字母符号。法国人吗?俄语?普通话?
  • 最后,你需要考虑无数的特殊情况。也就是说,您需要一个知识库来解决各种情况,这些情况不会被您使用的“正常”规则所涵盖。

当然,所有上述操作都可以使用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>