代码之家  ›  专栏  ›  技术社区  ›  dtc

在SQL Server中,匹配街道地址的方法是什么?

  •  4
  • dtc  · 技术社区  · 15 年前

    我们有一列街道地址:

    123 Maple Rd.
    321第一大道。
    等。。。

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

    123枫路
    321大街第一号

    我们的第一个想法是去掉所有街道术语(RD、ST、AVE、BLVD等)的输入。

    显然,这并不总是可靠的匹配。是否有其他方法尝试匹配SQL Server中的街道地址?

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

    7 回复  |  直到 15 年前
        1
  •  2
  •   TLiebe    15 年前

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

        2
  •  5
  •   Mark Byers    15 年前

    与其剔除那些可变的东西,不如把它们转换成一种可以比较的“规范形式”。

    例如,在比较之前,将“rd”或“rd.”替换为“road”,将“st”或“st.”替换为“street”。

        3
  •  5
  •   Community CDub    8 年前

    您可以考虑使用 Levenshtein Distance 算法。

    您可以在SQL Server中将其创建为用户定义函数,在该函数中,它将返回需要对字符串“a”执行的操作数,以便它成为字符串“b”。然后,您可以将levenshtein距离函数的结果与某个固定阈值或从字符串长度派生的某个值进行比较。

    您只需如下使用:

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

    AS Mark Byers suggested ,如果使用Levenshtein距离,将变量项转换为规范形式将有所帮助。

    使用 Full-Text Search 可能是另一种选择,特别是因为Levenshtein通常需要全表扫描。此决定可能取决于您打算多久进行一次这些查询。

    您可能需要检查以下针对SQL Server的Levenshtein距离实现:

    注意:您需要为上述实现实现实现一个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
    

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

        4
  •  3
  •   David Oneill    15 年前

    我认为对你来说,第一步是更好地定义你对不同地址的慷慨与否。例如,哪些匹配,哪些不匹配:

    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
  •  2
  •   Jason    15 年前