【问题标题】:What are ways to match street addresses in SQL Server?在 SQL Server 中匹配街道地址的方法有哪些?
【发布时间】:2010-01-19 21:41:37
【问题描述】:

我们有一个街道地址栏:

枫树路 123 号
第一大道 321 号
等等……

有没有办法将这些地址与给定的输入相匹配?输入将是街道地址,但格式可能不同。例如:

枫叶路 123 号
第一大道 321 号

我们的第一个想法是去除所有街道术语(rd、st、ave、blvd 等)的输入。

显然,这不会一直可靠地匹配。还有其他方法可以尝试在 SQL Server 中匹配街道地址吗?

我们可以使用用户定义的函数、存储过程和常规的旧 t-sql。我们不能使用 clr。

【问题讨论】:

  • 听起来像是全文搜索的工作。什么版本的 SQL Server?
  • 您可能想仔细阅读 USPS 的寻址标准文档……可能会让您了解一些可能性。 pe.usps.gov/text/pub28/welcome.htm

标签: sql sql-server


【解决方案1】:

与其剔除可以变化的东西,不如尝试将它们转换为可以比较的“规范形式”。

例如,替换“rd”或“rd”。用“路”和“st”或“st”。在比较之前与“街道”。

【讨论】:

  • 'st johns Lane' ->'street johns Lane'
  • 这就是为什么我走相反的方向并从多头转换为空头。所以圣约翰巷 -> 圣约翰巷。最大的问题是当人们使用非标准缩写时,或者由于上游某处的最大字段长度(您得到“Avenu”而不是“Avenue”)而导致单词被截断。没有灵丹妙药。
【解决方案2】:

您可能需要考虑使用Levenshtein Distance 算法。

您可以在 SQL Server 中将其创建为用户定义的函数,其中它将返回需要对 String_A 执行的操作数,以使其变为 String_B。然后,您可以将 Levenshtein Distance 函数的结果与某个固定阈值或某个从字符串长度派生的值进行比较。

您只需按如下方式使用它:

... WHERE LEVENSHTEIN(address_in_db, address_to_search) < 5;

作为Mark Byers suggested,如果您使用 Levenshtein Distance,将变量项转换为规范形式会有所帮助。

使用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

您可能也有兴趣查看以下文章:

【讨论】:

  • 很好的答案。不过警告。 TSQL 实现的链接已断开。有时它会在诈骗页面中打开。
【解决方案3】:

为了进行正确的街道地址匹配,您需要将地址转换为标准化格式。查看 USPS 邮政标准here(我假设您正在处理美国地址)。如果您希望能够处理所有类型的美国邮件地址,这绝不是一个简单的过程。 QAS 和 Satori Software 等公司提供的软件可用于为您进行标准化。您需要导出地址,通过软件运行它们,然后使用更新的地址加载数据库。还有第三方供应商也将执行地址标准化。对于您正在尝试做的事情来说,这可能有点矫枉过正,但这是最好的方法。如果您的数据库中的地址是标准化的,您将有更好的机会匹配它们(特别是如果您也可以标准化输入)。

【讨论】:

  • 我们就是这样走的。在尝试(没有成功)匹配地址之后,我们最终说服人们最好不要走那条路。相反,我们正在使用某种类型的第 3 方软件来为我们标准化地址。
【解决方案4】:

我认为您的第一步是更好地定义您对不同地址的慷慨程度。例如,哪些匹配,哪些不匹配:

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

枫叶街和枫叶大道是否在同一个区域?橡树街和橡树大道怎么样?

例如,我住的地方有许多街道/道路/blvds/ave,它们都被命名为 Owasso。我住在奥瓦索街,它与北奥瓦索大道相连,北奥瓦索大道与南奥瓦索大道相连。但是,维多利亚大街只有一条。

鉴于这一现实,您必须拥有所有道路名称的数据库,并寻找最近的道路(并单独处理数字)

提前决定你会坚持什么,你不会坚持什么。

【讨论】:

    【解决方案5】:

    地址匹配和重复数据删除是一件麻烦事。当他们说地址需要首先向当地邮政标准机构标准化时,其他海报是正确的(例如,如果它是美国地址,则为 USPS)。一旦地址采用标准格式,剩下的就很容易了。

    有几个第三方服务会在列表中为您标记重复项。仅使用 MySQL 子查询执行此操作不会考虑地址格式和标准的差异。 USPS(针对美国地址)有一些制定这些标准的准则,但只有少数供应商获得了执行此类操作的认证。

    因此,我建议您的最佳答案是将表格导出为 CSV 文件,例如,然后将其提交给有能力的列表处理器。 SmartyStreets 的Bulk Address Validation Tool 就是其中之一,它将在几秒钟到几分钟内自动为您完成。它将使用名为“Duplicate”的新字段和其中的 Y 值来标记重复行。

    尝试标准化和验证几个地址here,以了解输出的样子。

    完全披露:我为SmartyStreets工作

    【讨论】:

      【解决方案6】:

      剥离数据是个坏主意。许多城镇将有数十种相同街道的变体 - Oak Street、Oak Road、Oak Lane、Oak Circle、Oak Court、Oak Avenue 等......如上所述,转换为规范的 USPS 缩写是更好的方法。

      【讨论】:

        【解决方案7】:

        【讨论】:

        • 此链接指向 MSDN 2005 年 9 月版中的文章。如果您点击链接,您可以将其下载为CHM 文件
        【解决方案8】:

        你可以试试 SOUNDEX 看看是否能让你接近。 http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx

        【讨论】:

          猜你喜欢
          • 2012-03-12
          • 2020-09-14
          • 1970-01-01
          • 2015-06-26
          • 1970-01-01
          • 1970-01-01
          • 2019-03-16
          • 2015-07-25
          • 2011-09-06
          相关资源
          最近更新 更多