sql - 使用函数匹配字符串

标签 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 的行感兴趣,因此可以从输出中删除其中的大部分,如果可能甚至不用作比较点。

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

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

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

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

谢谢!

最佳答案

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

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

关于sql - 使用函数匹配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7320262/

相关文章:

sql - 锯齿图案局部最大值的每日总计

mysql - 计算一个字符串在 VARCHAR 字段中出现的次数?

.net - LINQ to SQL 查询中的 C# 动态 WHERE 子句

sql-server-2005 - SQL Server 2008 try catch 错误收集

sql-server - 通过 SQL Operations Studio 连接到 MAC OSX 上的 Docker SQL Server 2017 容器

sql - 从 sql server 中的 2 个表中获取不同的列名

sql - 是否存在关于 ActiveRecord 关系的困惑?方法,尤其是限制和偏移

mysql - 将MySQL建表查询转换为H2语法

sql-server - 操作数类型冲突 : nvarchar is incompatible with Type_WP_Days

php - mssql_execute 失败, "stored procedure execution failed"