我正在尝试检索地址 1 <>地址 2 的记录。
我遇到了一种情况,其中地址类似于以下示例:
address 1 address 2
69 Cherokee Cir Unit 204 69 CHEROKEE CIR # 204
我的查询返回属于这种情况的记录,但这是不正确的,因为地址实际上是相同的。
是否有可能举例说明如何解决这个问题?
地址1 和地址 2 的地址值都是完整块,不存储在多个列中。
这是一种计算不同单词的方法。 但它使用自 Sql Server 2017 以来才添加的STRING_SPLIT
函数。
select t.*
from YourTable t
cross apply
(
select
count(nullif(s1.value,' ')) as diffcnt1
,count(nullif(s2.value,' ')) as diffcnt2
--,string_agg(nullif(s1.value,' '),'|') as diff1,
--,string_agg(nullif(s2.value,' '),'|') as diff2
from string_split(t.address1,' ') s1
full join string_split(t.address2,' ') s2
on lower(s1.value) = lower(s2.value)
where s1.value is null
or s2.value is null
) ca
where t.address1 != t.address2
and (ca.diffcnt1>1 or ca.diffcnt2>1)
在这里测试数据库<>小提琴
或者尝试这种快速和肮脏的方法,至少过滤一些相对相似的方法。
通过检查字符串之间的差异。
SELECT *
FROM YourTable
WHERE (LOWER(address1) != LOWER(address2))
AND DIFFERENCE(LOWER(address1), LOWER(address2)) < 4
但DIFFERENCE
只是比较字符串的SOUNDEX
值。 因此,有可能出现假阳性或假阴性。
也许检查琴弦之间的列文施泰因距离会更准确。
这是一篇关于在 Sql Server 中计算该指标的旧 SO 帖子:T-SQL 中的 Levenshtein 距离
并且存在其他字符串指标。
以下是如何使用 REPLACE 来实现此目的。但即使任一地址中都有额外的空格,也意味着它们不匹配。
declare @Something table
(
address1 varchar(50)
, address2 varchar(50)
)
insert @Something values
('69 Cherokee Cir Unit 204', '69 CHEROKEE CIR # 204')
select *
from @Something s
where s.address1 = replace(s.address2, '#', 'Unit')