Логика и запрос для получения имени от полного имени - PullRequest
0 голосов
/ 29 августа 2018

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

John Smith
Smith, John
Mr. John Smith
Dr. John Smith
Mrs. Jane Smith
Ms. Jane Smith
Jane Smith, Esq.
Jane Smith, MD

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

Я думаю, что правильная логика для этого состоит в том, чтобы сопоставить значения имени + пробел с таблицей полного имени через LIKE. Пространство таково, что «Дэвид Джонсон» не соответствует «Джону».

Я думаю, что способ сделать это - оператор обновления с вложенным запросом. Вот что у меня есть:

UPDATE "employees" 
    SET "employees".FirstName = (SELECT  firstname 
                                 FROM genders 
                                 WHERE fullname LIKE '%"employees".FirstName %')

1 Ответ

0 голосов
/ 29 августа 2018

Что вы действительно хотите сделать, так это использовать возможности полнотекстового поиска Postgres. Вы можете создать список стоп-слов, содержащий названия для исключения (Mr, Ms и т. Д.). Затем настройте конфигурацию поиска для использования ваших стоп-слов.

После правильной настройки конфигурации поиска ваш запрос будет выглядеть примерно так (это вариант SELECT: изменение на UPDATE будет тривиальным):

SELECT employees.full_name, genders.first_name 
FROM employees
    LEFT JOIN genders ON
        TO_TSVECTOR('english_titles', employees.full_name) 
            @@ TO_TSQUERY('english_titles', genders.first_name)

Это даст вам следующие результаты:

full_name           first_name          
"John Smith"        "John"
"Smith, John"       "John"
"Mr. John Smith"    "John"
"Dr. John Smith"    "John"
"Mrs. Jane Smith"   "Jane"
"Ms. Jane Smith"    "Jane"
"Jane Smith, Esq."  "Jane"
"Jane Smith, MD"    "Jane"
"David Johnson"     NULL

Чтобы это работало, вам необходимо выполнить следующие шаги:

  1. Создайте файл стоп-слов, содержащий названия должностей, и поместите его в каталог $SHAREDIR/tsearch_data Postgres. Смотри https://www.postgresql.org/docs/9.1/static/textsearch-dictionaries.html#TEXTSEARCH-STOPWORDS.
  2. Создайте словарь, который использует этот список стоп-слов (вы, вероятно, можете использовать pg_catalog.simple в качестве словаря шаблонов). См https://www.postgresql.org/docs/9.1/static/textsearch-dictionaries.html#TEXTSEARCH-SIMPLE-DICTIONARY.
  3. Создание конфигурации поиска для названий должностей. Смотри https://www.postgresql.org/docs/9.1/static/textsearch-configuration.html.
  4. Измените конфигурацию поиска, чтобы использовать словарь, созданный на шаге 2 (см. Ссылку выше).

Теперь, после всего сказанного, вам нужно тщательно продумать пару вещей:

  • Как вы собираетесь обращаться с людьми, чья фамилия совпадает с именем в вашей таблице Genders? Например, у вас есть кто-то по имени John Stuart, и оба John и Stuart находятся в вашей таблице genders. Как вы ожидаете справиться с этим?
  • Как вы собираетесь обращаться с людьми с никами или иметь только одно имя? Я бы настоятельно рекомендовал бы вам прочитать Программисты лжи верят в имена , чтобы убедиться, что вы не делаете необоснованных предположений.
  • Почему ваша таблица с первым именем называется genders? Ожидаете ли вы сопоставить людей по имени по полу? Если так, то это опасный путь - есть имена, которые можно использовать для любого пола.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...