我们有一个街道地址列:
123 Maple Rd。
321 1st Ave.
等...
有没有办法将这些地址与给定的输入相匹配?输入将是街道地址,但可能不是相同的格式。例如:
123 Maple Road
321第一大道
我们首先想到的是删除所有街道术语(rd,st,ave,blvd等)的输入。
显然,这种情况一直无法比拟。有没有其他方法可以尝试匹配SQL Server中的街道地址?
我们可以使用用户定义的函数,存储过程和常规的旧t-sql。我们不能使用clr。
答案 0 :(得分:5)
尝试将它们转换为可以比较的“规范形式”,而不是剥离可变的东西。
例如,替换'rd'或'rd。' 'road'和'st'或'st。'在比较前与'街道'。
答案 1 :(得分:5)
您可能需要考虑使用Levenshtein Distance算法。
您可以在SQL Server中将其创建为用户定义的函数,它将返回需要在String_A上执行的操作数,以使其成为String_B。然后,您可以将Levenshtein距离函数的结果与某个固定阈值进行比较,或者与从字符串长度得到的某个值进行比较。
您只需按以下方式使用它:
... WHERE LEVENSHTEIN(address_in_db, address_to_search) < 5;
作为Mark Byers suggested,如果您使用Levenshtein距离,将变量术语转换为规范形式将会有所帮助。
使用Full-Text Search可能是另一种选择,特别是因为Levenshtein通常需要全表扫描。此决定可能取决于您打算进行这些查询的频率。
您可能需要查看以下针对SQL Server的Levenshtein Distance实现:
注意:您需要为上述实现实现MIN3功能。您可以使用以下内容:
CREATE FUNCTION MIN3(@a int, @b int, @c int)
RETURNS int
AS
BEGIN
DECLARE @m INT
SET @m = @a
IF @b < @m SET @m = @b
IF @c < @m SET @m = @c
RETURN @m
END
您可能还有兴趣查看以下文章:
答案 2 :(得分:3)
我认为您的第一步是更好地定义您对不同地址的慷慨程度。例如,哪些匹配,哪些不匹配:
123 Maple Street
123 Maple St
123 maple street
123 mpale street
123 maple
123. maple st
123 N maple street
123 maple ave
123 maple blvd
Maple Street和Maple Blvd是否在同一地区?橡树街和橡树大道怎么样。
例如,我居住在那里的许多街道/道路/ blvds / ave都被命名为Owasso。我住在Owasso Street,它连接着North Owasso Blvd,连接着South Owasso Blvd.但是,只有一个维多利亚大道。
鉴于现实,您必须拥有所有道路名称的数据库,并寻找最近的道路(并单独处理该号码)
OR
提前做出决定,坚持做什么以及不做什么。
答案 3 :(得分:3)
地址匹配和重复数据删除是一件麻烦事。其他发帖人说,首先需要向当地邮政标准局标准化地址时才是正确的(例如,如果是美国地址,则为USPS)。一旦地址采用标准格式,其余的操作就很容易。
有一些第三方服务会为您标记列表中的重复项。仅使用MySQL子查询执行此操作不会解决地址格式和标准的差异。 USPS(用于美国地址)具有制定这些标准的某些准则,但是只有少数供应商被认证可以执行此类操作。
因此,我建议您最好的答案是将表导出到CSV文件中,然后将其提交给有能力的列表处理器。 SmartyStreets的Bulk Address Validation Tool就是其中一种,它将在几秒钟到几分钟内自动为您完成。它将使用新字段“ Duplicate”标记重复的行,并在其中添加Y值。
尝试标准化和验证几个地址here,以了解输出的外观。
完全公开:我为SmartyStreets工作
答案 4 :(得分:2)
为了进行正确的街道地址匹配,您需要将地址变为标准化形式。看看USPS邮政标准here(我很担心你在处理美国地址)。如果您希望能够处理所有类型的美国邮件地址,这绝不是一个简单的过程。 QAS和Satori Software等公司提供的软件可供您进行标准化。您需要导出地址,通过软件运行它们,然后使用更新的地址加载数据库。还有第三方供应商也将执行地址标准化。对于你想要做的事情可能有点过分,但这是最好的方法。如果您的数据库中的地址是标准化的,那么您将有更好的机会匹配它们(特别是如果您也可以标准化输入)。
答案 5 :(得分:2)
剥离数据是一个坏主意。许多城镇将有相同街道的数十种不同的变化 - 橡树街,橡树路,橡树巷,橡树圈,橡树苑,橡树大道等......如上所述,转换为规范USPS缩写是一种更好的方法。
答案 6 :(得分:1)
答案 7 :(得分:1)
您可以尝试SOUNDEX,看看是否能让您接近。 http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx