kap*_*apz 2 sql t-sql sql-server
我想建立一个查询来识别一个名称中是否存在多个标题。
例如:A科恩先生B科恩夫人
标题列表:
(“先生”,“先生”,“夫人”,“女士”,“小姐”,“小姐”,“其他”,“女士”,“女士”)
我可以使用以下方法检查第一个标题:
IF (SUBSTRING(@Name, 0, CHARINDEX(' ', @Name)) NOT IN
('Mr', 'Mr.', 'Mrs', 'Mrs.', 'Miss', 'Miss.', 'Other', 'Ms', 'Ms.'))
Run Code Online (Sandbox Code Playgroud)
但是我坚持要检查第二个标题。
我可以使用下面的代码获得没有第一标题的部分:
LTRIM(STUFF(@Name, CHARINDEX(Title, @Name), LEN(Title), ''))
Run Code Online (Sandbox Code Playgroud)
这给我的输出为'A Cohen Mrs B Cohen'。由此,我想检查输出中是否存在任何标题。
我知道我可以LIKE为每个标题寻求多个运营商,但我正在寻找更简洁的东西。
使用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;
Run Code Online (Sandbox Code Playgroud)
注意,这将必定会找到“ Mr。”,“ Mrs”,“ Mrs。”,“ Miss。”和“ Ms”的重复项。因为它们具有与相同标题匹配的其他标题(例如“ Mr”)。这似乎符合您指定的条件。
为防止这种情况,您可能需要在标题后留一个空格。如果是这样,请使用:
on name like '%' + v.title + ' %'
Run Code Online (Sandbox Code Playgroud)