Разобрать тайское имя в первый последний - PullRequest
0 голосов
/ 17 января 2019

Мне нужно разобрать список полных имен по имени и фамилии. Если отчество включено, оно должно быть включено в поле первого имени.

Джон Смит будет:

Имя = Джон

LastName = Smith

Джон Дж. Смит будет:

Имя = Джон Дж.

LastName = Smith

Проблема в том, что имена могут быть либо тайскими, либо английскими. Мне нужно правильно разобрать любой набор. Я попробовал почти все ...

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 голосов
/ 17 января 2019

Я тайка, и я знаю одно: тайцы не используют отчество.

0 голосов
/ 17 января 2019

Я не могу читать по-тайски (я не такой умный), но, возможно, это может помочь.

Здесь мы используем CROSS APPLY, чтобы «исправить» строку, и тогда это небольшое дело PasrName() и Concat()

Я должен добавить, что разбор имен - это скользкий путь. Нужно учитывать

  • Фамилии, состоящие из нескольких слов, т.е. Де ла Круз
  • Суффикс т.е. Ричард Р Каппеллетти MD

Пример

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)

Returns

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

РЕДАКТИРОВАТЬ 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)
...