使用函数进行字符串匹

时间:2011-09-06 12:56:37

标签: sql sql-server sql-server-2005 tsql

我正在寻找一种模糊匹配字符串(在我的情况下是联系人名称)的方法,以查看数据库中可能存在重复的位置。 “重复”实际上是名称非常相似的情况,因为每一行都有唯一的数据。

我一直在四处寻找并认为:JaroWinkler Function最适合我的需要,这对小组字符串很有效。

但是,我希望比较大约260,000个不同的字符串,并希望看看是否有办法避免检查所有可能的组合(因为这会给我大约290亿行检查)。

因为它是我用于小样本集的查询:

CREATE TABLE #data
(
    ROW INT IDENTITY (1,1)
    ,string VARCHAR(50)
)

INSERT INTO #data SELECT 'Watts' AS string
UNION ALL SELECT 'Burns'
UNION ALL SELECT 'McLaughlan'
UNION ALL SELECT 'Darry'
UNION ALL SELECT 'Storie'
UNION ALL SELECT 'Mcluangan'
UNION ALL SELECT  'Burnsysx'

SELECT 
data1.string as string1
,data1.row as row1
,data2.string as string2
,data2.row as row2
,dbo.JaroWinkler(data1.string,data2.string) as correlation
from #data data1
CROSS JOIN #data data2
WHERE data1.row < data2.row

对于此示例数据,返回21行,但我只对相关性大于0.7的行感兴趣,因此大部分可以从输出中删除,如果可能甚至不用作比较点。 / p>

因此,对于上面的示例数据,我想返回以下行:

string1 row1    string2 row2    correlation
McLaughlan  3   Mcluangan     6 0.8962954
Burns            2  Burnsysx  7 0.874999125

我知道使用不等式三角形连接不是一个好主意,那么使用光标会更好吗?遗憾的是,我需要相互检查所有记录,以确保不存在重复记录。

出于测试的目的,可以使用Difference(data1.string,data2.string),仅过滤值= 4的情况(这样我至少可以了解如何最好地向前移动)!!

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您要查找重复的名称,是否考虑过使用内置的SOUNDEX()函数来查找匹配项?

答案 1 :(得分:0)

如果你还没有尝试过,SSIS中的模糊逻辑功能可能值得一试。它可能比您拥有的查询更具性能,并且具有更多“可调整”参数。设置相对容易。

http://msdn.microsoft.com/en-us/magazine/cc163731.aspx