Sql 检查名称是否包含多个标题
我想建立一个查询,以确定一个名称中是否有多个标题 A科恩先生B科恩夫人 标题列表: (‘先生’、‘先生’、‘夫人’、‘小姐’、‘小姐’、‘其他’、‘女士’、‘女士’) 我可以通过以下方式查看第一个标题:Sql 检查名称是否包含多个标题,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想建立一个查询,以确定一个名称中是否有多个标题 A科恩先生B科恩夫人 标题列表: (‘先生’、‘先生’、‘夫人’、‘小姐’、‘小姐’、‘其他’、‘女士’、‘女士’) 我可以通过以下方式查看第一个标题: IF (SUBSTRING(@Name, 0, CHARINDEX(' ', @Name)) NOT IN ('Mr', 'Mr.', 'Mrs', 'Mrs.', 'Miss', 'Miss.', 'Other', 'Ms', 'Ms.')) 但我一直在寻找第二个冠军 我可以使用
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'
。从这里,我想检查这些标题是否存在于这个输出中
我知道我可以为每个标题使用多个
操作符,比如
操作符,但我正在寻找更整洁的操作符。使用连接和派生表:
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;
请注意,这必然会找到“先生”、“太太”、“太太”、“小姐”和“女士”的重复项,因为这些标题与相同的标题(如“先生”)有其他匹配的标题。这似乎符合您指定的条件
为了防止出现这种情况,您可能需要在标题后留一个空格。如果是,请使用:
on name like '%' + v.title + ' %'
这不是最快的查询,但你可以将标题放在一个表变量中,使用like和group by/have count>1。史密斯先生和科恩先生是一个标题还是两个?为什么不只查找有空格的匹配项,然后是标题(即“Mr”),它只会在有第二个标题的地方返回?@johncapelletti,这是两个。我正在检查组合名称。提示:注意那些不能正确处理诸如“Missy Brother”、“Adelaide Salmissra”和“Jim Bob Strother”等名称的解决方案,尤其是与其他名称组合时。同意,我只会在没有句号的项中添加尾随空格,即('Mr')您不能在HAVING
子句中使用别名num\u titles
,而不是COUNT(*)
。如果Mr
存在两次会怎样?它应该被计数。“不能在HAVING子句中使用别名num_titles而不是COUNT()”*@Sami true这是MySQL语法,允许在HAVING子句中使用别名,这是您了解许多数据库系统后得到的结果。。“有时候你开始把事情搞混了,”雷蒙德尼兰德说,“我不知道!这条评论是Gordon编辑他的问题的便条,因为我不会编辑他的代码,这是我唯一不碰的东西。如果Mr
存在两次或>2,仍将返回错误的结果。见John Cappelletti评论和OP的回复。@Sami mine评论更适合一般读者,因此Gordon不会因为该语法而获得不必要的否决票,因为其他人会读到你关于该查询“完全无效”的评论。。“这条评论是Gordon编辑他的问题的便条,因为我不会再编辑他的代码,这是我唯一不碰的东西”编辑那些小语法“拼写错误”很好“很确定Gordon不介意我修改它。