有哪些方法可以匹配SQL Server中的街道地址?

dtc*_*dtc 4 sql sql-server street-address

我们有一个街道地址列:

123 Maple Rd.
321 1st Ave.
等等...

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

123 Maple Road
321 1st Avenue

我们的第一个想法是剥离所有街道术语(rd,st,ave,blvd等)的输入.

显然,这种情况一直不可靠.有没有其他方法可以尝试匹配SQL Server中的街道地址?

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

Mar*_*ers 5

而不是剥离可变的东西,尝试将它们转换为可以比较的"规范形式".

例如,替换'rd'或'rd.' 'road'和'st'或'st.' 与'街道'比较之前.

  • 'st johns Lane' ->'street johns Lane' (2认同)

Dan*_*llo 5

您可能需要考虑使用Levenshtein距离算法.

您可以在SQL Server中将其创建为用户定义的函数,在该函数中它将返回需要在String_A上执行的操作数,以使其成为String_B.然后,您可以将Levenshtein距离函数的结果与某个固定阈值进行比较,或者与从字符串长度得到的某个值进行比较.

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

... WHERE LEVENSHTEIN(address_in_db, address_to_search) < 5;
Run Code Online (Sandbox Code Playgroud)

正如Mark Byers所说,如果你使用Levenshtein Distance,将变量项转换为规范形式将会有所帮助.

使用全文搜索可能是另一种选择,特别是因为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
Run Code Online (Sandbox Code Playgroud)

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


TLi*_*ebe 4

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