AZ93 Ответов: 2

Sql, нужна функция или запрос, который бы разбирал имя на имя, фамилию и отчество:


есть много различий в названии. Нам нужен запрос в sql, который будет разбирать его на имя, фамилию, отчество и название:

Вариативность Именования :
--ОРДУЭЙ,БРЕНДА

Фамилия: бренда, имя: Ордуэй, отчество: нуль, титул: нуль

--МЕТЕНИ,ДОРИС А

Фамилия: Метени, имя: Дорис, отчество: а, титул: NULL

--МАРАБЕЛЛА,ЛЮСИЛЬ СИ.
Фамилия: МАРАБЕЛЛА, имя: Люсиль, отчество: с, титул: NULL

--БЕРРОУЗ-МЛАДШИЙ,ДЖОЗЕФ
Фамилия: Берроуз, имя: Джозеф, отчество: , титул: младший


--ЗУНИГА,СЛОАН ЭЛИЗАБЕТ-РОСС
Фамилия: Зунига, имя: Слоан, отчество: Элизабет-Росс , титул: NULL


--ОЛДРИДЖ III,ВЕРНОН Г.
Фамилия: Олдридж, имя: Вернон, отчество: G , титул: III

--ЭНДРЮС-УОТЛИ,САВАННА
Фамилия: Эндрюс-Уотли, имя: Саванна, отчество:нуль , титул: нуль

--ЭШМОР БЕЛЛ,КЭРРИ СИ
Фамилия: Эшмор Белл, имя: Кэрри, отчество: C, титул: NULL

--АТКИНС РОБИНСОН,БАРОНЕТТА
Фамилия: Аткинс Робинсон, имя: БАРОНЕТТА, отчество: нуль, титул: нуль

--ФАРРЕЛЛ II,БЕНДЖАМИН ТАРЕНС
Фамилия: Фаррелл, имя: Бенджамин, отчество: ТАРЕНС, титул: II

-

Что я уже пробовал:

Функция ltrim(функция rtrim(слева([ParticipantName],функция charindex(',',[ParticipantName])-1))) Как фамилия,

Функция ltrim(функция rtrim(слева(имя,функция charindex (' ', "имя") -1)))как имя,
Подстрока ("имя", 1 ,случай, когда функция charindex (' ' , "имя") = 0 тогда лен(имя) еще функция charindex (' ' , "имя") -1 конец) как имя,

2 Ответов

Рейтинг:
2

CHill60

@OriginalGriff не ошибается, но у меня есть класс, который делает это. Он используется для разбиения имен из файлов данных, предоставленных третьими лицами, а затем я пытаюсь сопоставить эти имена с именами (хранящимися правильно) в наших базах данных.

Она не написана на SQL, и я также не могу поделиться ею с вами, потому что авторские права принадлежат компании, в которой я работаю (несмотря на то, что я ее написал). Однако я могу поделиться методами, которые использовал...

У меня есть несколько таблиц, которые помогают:
- Список названий, которые можно использовать. Это все в нижнем регистре и включает в себя такие вещи, как "очень преподобный" и "очень ревд". Мне повезло, что эта таблица довольно мала и основана на наших фактических данных, а не на чем-то возможном. Эти списки могут оказаться полезными при создании такой таблицы:
Английские почетные звания - Википедия[^]
Список названий - Википедия[^], но я советую вам ограничить то, что там находится, вашими наиболее вероятными названиями.

- Список суффиксов, которые можно использовать. Также в нижнем регистре и включая такие вещи, как "старший", "iii", "ВТО". Взгляните на это Суффикс (имя) - Википедия[^]

- Список вещей для составных имен, например "фон", "Ван", "Ван дер", "делла"

- Список альтернативных имен (вам, вероятно, это не нужно, так как вы не пытаетесь сопоставить вещи) - например, "Алекс" для "Александра" или "Александра", "Роб", "Боб", "Робби", "Робби" для "Роберта"

- Есть и другие таблицы, которые имеют дело с корпоративными названиями.


Я использую метод "грубой силы"...

1. Удалите все знаки препинания - ",", ".", ";". Если я удаляю дефис, я делаю пометку об этом, чтобы потом можно было поставить его обратно, если понадобится.

2. Проверьте наличие нескольких имен (например, Мистер и миссис)

3. Удалите все суффиксы - я добавляю пробел в конец каждого имени, чтобы суффиксы были окружены пробелом в каждом конце - в противном случае вы можете в конечном итоге удалить подлинные части имен

4. Удалите заголовок - как указано выше

5. Справляется с любой составные имена.

6. отделите части, используя пространство в качестве разделителя

7. перестройте части имени по мере необходимости - например, был ли дефис и думаем ли мы, что он находится в фамилии или имени(именах). Следите за такими вещами, как "Энн-Мари Диксон-Браун"

Это может быть мучительно медленно, как вы можете себе представить, хотя, честно говоря, это та часть соответствия, которая занимает большую часть времени. Самое главное, как намекает @OriginalGriff, он не будет точным в 100% случаев. Особенно в вашем случае, поскольку недостаточно различать имена и фамилии - хотя, если шаблон всегда заключается в том, чтобы ставить имена после первой запятой, вы могли бы использовать этот факт.

Как бы то ни было, я не думаю, что SQL-это путь вперед с этим.


Рейтинг:
0

OriginalGriff

Вы не найдете ни одного - или, по крайней мере, вы не найдете тот, который не включает в себя огромный список "названия", так что вы можете различить
--ОЛДРИДЖ III,ВЕРНОН Г.
от
--ЭШМОР БЕЛЛ,КЭРРИ СИ

И даже тогда не все культуры перечисляют "фамилию" так, как это делают западные страны.
А что бы вы сделали с "капитаном сэром Ричардом Фрэнсисом Бертоном KCMG FRGS"?

Если вы хотите точно "разбить" имя, вам нужно сделать это в точке ввода, а не тогда, когда оно хранится в виде одной строки.