我有一个包含城市名称的“城市”表,我有一个我刚刚创建的另一个表,包含来自不同来源的城市。当我运行查询以匹配两个表之间的城市时,我发现大约5000个不匹配。
所以请提供一些我可以用来匹配城市的查询(因为有时用户输入的城市名称中有一个或两个字符不同)...我创建了一个工作正常的查询,但我需要这样的查询来匹配更多
请建议我在这种情况下该怎么做。
SELECT distinct hsm.countryname,co.countryname,hsm.city,co.city
FROM HotelSourceMap AS hsm
INNER JOIN
( SELECT c.*,cu.countryName
FROM city c
INNER JOIN country cu ON c.countryid= cu.countryId
) co
ON (charindex(co.city,hsm.city) > 0 AND hsm.countryid = co.countryid) AND
hsm.cityid is null
答案 0 :(得分:18)
如果将Levenshtein Distance算法实现为用户定义的函数,它将返回需要在string_1上执行的操作数,以使其成为string_2。然后,您可以将Levenshtein距离函数的结果与固定阈值或string_1或string_2的百分比长度进行比较。
您只需按以下方式使用它:
WHERE LD(city_1, city_2) < 4;
使用Full-Text Search可能是另一种选择,特别是因为Levenshtein Distance的实现需要全表扫描。此决定可能取决于您打算进行此比较的频率。
您可能需要查看以下针对SQL Server的Levenshtein Distance实现:
答案 1 :(得分:10)
您可以使用Soundex来比较拼写不同但发音相似的两个字符串。
这取决于它们是拼错的。如果只是拼写错误,可能会使用Daniel Vassallo推荐的Levenshtein Distance。如果是那些不确定城市是如何拼写的人的拼写错误,请使用Soundex。
也许同时使用两者!
答案 2 :(得分:2)
SoundEx功能对于此类场景是最佳选择,但仅在单词中的元音不正确或不存在时才有效。如果辅音不匹配,那就不行了。 另一种方法是编写一个简单的逻辑来定义两个单词之间的适当的不匹配限制;虽然不会给出100%的准确性,但可能会解决目的。一个简单的标量值函数,它在内部使用SoundeEx函数就足够了。
答案 3 :(得分:1)
最好的解决方案是使用SOUNDEX。我尝试了一些测试:它与Waterland,Witerland相匹配但不与Wiperland相匹配。我认为这应该符合您的要求。 SOUNDEX将一个alpha字符串转换为一个四字符代码,以查找类似的单词或名称。
select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Waterland')
==&GT;匹配
select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Witerland')
==&GT;匹配
select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Wiperland')
==&GT;没有匹配
答案 4 :(得分:0)
我很幸运使用Double Metaphone算法对名字进行模糊匹配。这个概念类似于Soundex,因为它可以将代码简化为代码,但它更为复杂。在我的数据库中,我将在插入时计算一个'name'字段和'nameDoubleMetaphone'字段。这使得搜索和加入非常快。
维基百科是一个很好的起点:http://en.wikipedia.org/wiki/Double_Metaphone
答案 5 :(得分:-6)
您必须修复数据库中的名称。数据库用于完全匹配,而不是“看起来很像”。最简单的修复可能是以CSV格式导出表格,将其加载到Excel(两列:主键和城市名称)中,然后使用拼写检查器来修复名称。修复所有名称后,再次导入表格。