首页 > 解决方案 > 使用 T-SQL 通过匹配模式搜索重复项

问题描述

我试图在列中查找重复项,其中数据表示相同的内容,但在处理过程中未正确规范化。我已经建立了一个 # 表,其中包含两个要搜索的关键字段。我不想修剪或操作该列,我想按顺序恢复任何大于 8 个字符的匹配项。

示例数据:

ID    Information
1     ABCDEF12.domain
2     domain.ABCDEF12
3     XYZABC123.22.26
4     222-XYZABC123-26
5     YYYYYYYYYYYYYYYY
6     AAAAAAAAAAAAAAAA
7     XYZABC123
8     ABCDEF12
9     123456789.1.2

将返回按长度最小排序:

ID    Information
8     ABCDEF12
1     ABCDEF12.domain
2     domain.ABCDEF12
7     XYZABC123
3     XYZABC123.22.26
4     222-XYZABC123-26

实现这一目标的任何起点、最佳实践或任何指针都会很棒。我不确定如何最初识别具有 8 个或更多字符的共同值以缩小数据集,排序相对简单。

标签: sql-server-2014

解决方案


这是一个解决方案。这使用了 Alan Burstein 的计数表 Number 函数

DECLARE @T1 TABLE ([ID] int, [Information] Nvarchar(16)) ;

INSERT INTO @T1 (ID ,Information)
VALUES
    (1, N'ABCDEF12.domain'),
    (2, N'domain.ABCDEF12'),
    (3, N'XYZABC123.22.26'),
    (4, N'222-XYZABC123-26'),
    (5, N'YYYYYYYYYYYYYYYY'),
    (6, N'AAAAAAAAAAAAAAAA'),
    (7, N'XYZABC123'),
    (8, N'ABCDEF12'),
    (9, N'123456789.1.2')
;

SELECT DISTINCT 
    T.ID,T.Information
FROM @T1 T
CROSS APPLY dbo.getNums(1, LEN(T.Information), 1, 1) N
INNER JOIN
    @T1 T1  ON  (   SUBSTRING(T.Information, N, LEN(T.Information)) LIKE '%' + T1.Information + '%' OR
                    SUBSTRING(T1.Information, N, LEN(T1.Information)) LIKE '%' + T.Information + '%' 
                )
            AND (   LEN(SUBSTRING(T1.Information, N, LEN(T1.Information))) > 8                      OR 
                    LEN(SUBSTRING(T.Information, N, LEN(T.Information))) > 8 
                )
            AND T1.ID <> T.ID

输出

ID  Information
4   222-XYZABC123-26
8   ABCDEF12
1   ABCDEF12.domain
2   domain.ABCDEF12
7   XYZABC123
3   XYZABC123.22.26

推荐阅读