我为一个名字严重的数据质量问题的组织工作。有15个数据库包含有关人员的信息。例如:
Database 1
Name=Fre&d Blo-ggs DOB 01/01/1980
Database 2
Name=Freddy Bloggs DOB 01/01/1980
如果用户使用我的搜索工具搜索Fred Bloggs,那么我希望找到这两个记录。我在考虑这样的事情:
SELECT * FROM Person WHERE Soundex('Fred Bloggs') = Soundex('Fre&d Blo-ggs')
建议像这样使用Soundex而不是使用像这样的替换语句:
select Replace(Replace(Replace(Name,',',''),'&',''),'@') from Person
where Replace(Replace(Replace(Name,',',''),'&',''),'@') = @Name
@Name是传入的变量。有更好的方法吗?例如使用正则表达式? Soundex会影响性能。
答案 0 :(得分:2)
好主意。我不建议使用它。我想那是" John Right"和#34; John Write"不一样,即使他们听到同样的话。我的意思是,最重要的是,你想要比较的是......如果你想比较名称声音是否相同,那么SOUNDEX
就可以了。< / p>
但是,我建议以某种方式纠正您的数据。这将是一个真正的解决方案,虽然我可以想象这不是一个简单的解决方案。
希望我帮忙!
答案 1 :(得分:2)
如果soundex优于正则表达式取决于您的数据。例如,针对不同语言有不同的soundex版本。你必须检查你的数据,这是更好的..
当然,soundex确实会像您正在调用的任何其他附加功能一样影响性能。如果性能成为问题,我建议添加一个包含已经计算的soundex或规范化名称的附加列,并在其上创建索引。
根据自己的经验,我认为标准化/简化的搜索标准是例如姓氏,名字和出生日期的部分应该足以让所有人,但不是太多,所以用户可以决定他真正想要选择哪个人。
答案 2 :(得分:1)
Soundex不会帮助你。如果错误地在名称中出现辅音,你就会陷入困境。
你更好地选择字符串距离并指定一个百分比。一种模糊匹配。
使用levenshtein编辑距离算法查看下面的模糊匹配链接。 Levenshtein edit distance - MS SQL SERVER