Разделение FullName в SQL - PullRequest
       4

Разделение FullName в SQL

0 голосов
/ 05 июня 2018

Я пытаюсь разделить Полное имя с помощью этого кода SQL, который я получил от кого-то здесь, в Переполнении стека, однако он не будет работать, потому что формат Полного имени подобен этому: «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 голосов
/ 06 июня 2018

В дополнение к ответу 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>.

0 голосов
/ 05 июня 2018

Анализ «полного имени» по имени, отчеству и фамилии не прост в базе данных.Не пытайтесь сделать это, если только это не домашняя работа, в которой рассматриваются упрощенные нереальные случаи.

Для анализа полного имени требуется нетривиальная логика для распознавания всех типов случаев.Для этого есть несколько причин:

  • В большинстве языков имена и фамилии состоят из нескольких слов.Они не пишутся через дефис, как в США, но включают в себя несколько слов.Даже в некоторых (очень немногих) американских именах есть несколько слов.
  • У некоторых людей есть отчество или вообще нет.
  • Некоторые люди включают суффиксы как часть своего имени:
    • «Jr», «Sr» - отчества.
    • «PhD», «Esquire» - заглавные.
    • Существуют более сложные случаи, передающие информацию разного рода.
  • В некоторых языках имена и фамилии инвертированы.Например, корейский.
  • Необходимо учитывать, что имена могут содержать специальные символы: например, "O'Hara".Почти все может быть действительным, в зависимости от языка.
  • Вам необходимо рассмотреть возможность использования Юникода, чтобы правильно распознавать буквенные символы.Французский кто-нибудь?Русский?Мандарин?
  • Наконец, вам нужно рассмотреть множество особых случаев.То есть вам нужна база знаний для разрешения всевозможных ситуаций, на которые не распространяются «нормальные» правила, которые вы будете использовать.

Конечно, все вышеперечисленное можносделано с использованием SQL.Тем не менее, SQL не является правильным вариантом IMHO.

0 голосов
/ 05 июня 2018

Вы можете использовать parsename() функцию:

select fullname, parsename(replace(fullname, ' ', '.'), 3) as lastname,
                 parsename(replace(fullname, ' ', '.'), 2) as firstname
from table t;
0 голосов
/ 05 июня 2018

Разделите строку, используя запятую.Результатом должен быть массив.Индекс ноль будет фамилией, а индекс один будет именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...