比较具有单位与#但实际上相同的地址



我正在尝试检索地址 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')

相关内容

  • 没有找到相关文章

最新更新