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.
而不是剥离可变的东西,尝试将它们转换为可以比较的"规范形式".
例如,替换'rd'或'rd.' 'road'和'st'或'st.' 与'街道'比较之前.
您可能需要考虑使用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)
您可能还有兴趣查看以下文章: