检查一个名称是否包含多个标题

时间:2019-05-02 13:05:06

标签: sql sql-server tsql

我想建立一个查询来识别一个名称中是否存在多个标题。

  

例如:A科恩先生B科恩夫人

标题列表:

  

(“先生”,“先生”,“夫人”,“女士”,“小姐”,“小姐”,“其他”,“女士”,“女士”)

我可以使用以下方法检查第一个标题:

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

但是我一直在检查第二个标题。

我可以使用下面的代码获得没有第一个标题的部分:

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

这给我的输出为'A Cohen Mrs B Cohen'。由此,我要检查输出中是否存在这些标题。

我知道我可以为每个标题寻求多个LIKE运算符,但是我正在寻找更整洁的东西。

1 个答案:

答案 0 :(得分:6)

使用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。”和“ Ms.”的重复项。因为它们具有与相同标题匹配的 other 标题(例如“ Mr”)。这似乎符合您指定的条件。

为防止这种情况,您可能需要在标题后留一个空格。如果是这样,请使用:

     on name like '%' + v.title + ' %'