Проверьте, содержит ли имя более одного заголовка - PullRequest
2 голосов
/ 02 мая 2019

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

Например: мистер А. Коэн, госпожа Б. Коэн

Список названий:

(«Мистер», «Мистер», «Миссис», «Миссис», «Мисс», «Мисс.», «Другое», «Мисс», «Мисс»)

Я могу проверить первый заголовок, используя ниже:

 IF (SUBSTRING(@Name, 0, CHARINDEX(' ', @Name)) NOT IN 
    ('Mr', 'Mr.', 'Mrs', 'Mrs.', 'Miss', 'Miss.', 'Other', 'Ms', 'Ms.'))

Но я застрял на проверке второго заголовка.

Я могу получитьчасть без 1-го заголовка, используя следующий код:

LTRIM(STUFF(@Name, CHARINDEX(Title, @Name), LEN(Title), ''))

Это дает мне вывод как 'A Cohen Mrs B Cohen'.Исходя из этого, я хочу проверить, существует ли какой-либо из этих заголовков в этих выходных данных.

Я знаю, что могу использовать несколько операторов LIKE для каждого заголовка, но я ищу что-то более аккуратное.

1 Ответ

6 голосов
/ 02 мая 2019

Используйте JOIN и производную таблицу:

select t.name, count(*) as num_titles
from t join
     (values ('Mr'), ('Mr.'), ('Mrs'), ('Mrs.'), ('Miss'), ('Miss.'), ('Other'), ('Ms'), ('Ms.')
     ) v(title)
     on name like '%' + v.title + '%'
group by t.name
having count(*) >= 2;

Обратите внимание, что здесь обязательно будут найдены дубликаты для "Mr.", "Mrs", "Mrs.", "Miss." И "Миз."потому что у них есть другие заголовки, которые соответствуют одному и тому же заголовку (например, "Mr").Это может соответствовать указанным вами условиям.

Чтобы предотвратить это, вам может потребоваться пробел после заголовка.Если это так, используйте:

     on name like '%' + v.title + ' %'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...