将泰国名字解析为第一名

时间:2019-01-17 14:42:21

标签: sql-server sql-server-2008 string-parsing thai

我需要将全名列表解析为名字和姓氏。如果包含中间名,则应将其包括在“拳头名称”字段中。

John Smith将是:

  

名字=约翰

     

姓氏=史密斯

约翰·史密斯(John J. Smith)将是:

  

FirstName = John J。

     

姓氏=史密斯

问题在于名称可能是泰语或英语字符集。我需要正确地解析任一集合。我已经尝试了几乎所有东西...

DECLARE @FullName NVARCHAR(MAX) = N'กล้วยไม้ สวามิวัศดุ์'
--DECLARE @FullName NVARCHAR(MAX) = N'Mark C. Wilson'

SELECT 
    LEN(@FullName) AS StringLength,
    LEN(@FullName) - LEN(REPLACE(@FullName,N' ', N'')),
    LEN(REPLACE(@FullName,N' ', N'')),
    @FullName AS FullName,
    REVERSE(@FullName) AS ReverseName, -- This is obviously no Reverse of the string
    CHARINDEX(N' ', REVERSE(@FullName)) AS LastSpaceLocation,
    CHARINDEX(N' ', @FullName) AS FirstSpaceLocation,
    LEN(@FullName) AS LenString,
    STUFF(@FullName, 1, CHARINDEX(N' ', @FullName), N'') as FirstName,
    RIGHT(@FullName, LEN(@FullName) - CHARINDEX(N' ', @FullName) + 1) as LastName,
    LEFT(@FullName, LEN(@FullName) - CHARINDEX(N' ', REVERSE(@FullName))) AS FirstName,
    STUFF(RIGHT(@FullName, CHARINDEX(N' ', REVERSE(@FullName))),1,1,N'') AS LastName,
    LEN(@FullName),
    REVERSE(@FullName),
    REVERSE(' '),
    LEN(@FullName) - CHARINDEX(reverse(' '), REVERSE(@FullName)) - LEN(' ') + 1

使用泰语字符集时,REVERSE根本无法工作。

2 个答案:

答案 0 :(得分:1)

我不会读泰语(我不太聪明),但这也许有帮助。

在这里,我们使用CROSS APPLY来“修复”字符串,然后这是PasrName()Concat()的小问题

我应该补充一点,解析名称是一个滑坡。需要考虑

  • 多词姓氏,即德拉克鲁兹
  • 后缀,即。理查德·R·卡佩莱蒂医学博士

示例

Declare @YourTable table (FullName nvarchar(100))
Insert Into @YourTable values
 ('John Smith')
,('John J. Smith')
,(N'กล้วยไม้ สวามิวัศดุ์')

Select A.*
      ,LastName  = replace(parsename(S,1),'|','.')
      ,FirstName = replace(concat(parsename(S,4),' '+parsename(S,3),' '+parsename(S,2)),'|','.')
 From  @YourTable A
 Cross Apply ( values (replace(replace(FullName,'.','|'),' ','.'))) B(S)

返回

FullName          LastName    FirstName
John Smith        Smith       John
John J. Smith     Smith       John J.
กล้วยไม้ สวามิวัศดุ์    สวามิวัศดุ์     กล้วยไม้

EDIT 2008版本

Select A.*
      ,LastName  = replace(parsename(S,1),'|','.')
      ,FirstName = replace( IsNull(parsename(S,4),'') + IsNull(' '+parsename(S,3),'') + IsNull(' '+parsename(S,2),''),'|','.')
 From  @YourTable A
 Cross Apply ( values (replace(replace(FullName,'.','|'),' ','.'))) B(S)

答案 1 :(得分:1)

我是泰国人,我知道的一件事是泰国人不做中间名。