我想建立一个查询来识别一个名称中是否存在多个标题。
例如: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
运算符,但是我正在寻找更整洁的东西。
答案 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 + ' %'