使用T-SQL通过匹配模式搜索重复项

时间:2018-06-26 13:47:15

标签: sql-server-2014

我正在尝试在列中查找重复项,其中数据表示同一件事,但在处理过程中未正确规范化。 我建立了一个#表,其中包含两个要搜索的关键字段。 与其修剪或处理该列,我不希望顺序地带回所有匹配的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个或更多字符的所有值,以缩小数据集的范围,排序相对简单。

2 个答案:

答案 0 :(得分:0)

这是一个解决方案。 这使用Alan Burstein's tally table Number function

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

答案 1 :(得分:0)

用您的表名替换YOUR_TABLE并尝试以下操作:

SELECT A.Id, TBL.Information, TBL.Id as New_Id
INTO #FINAL
FROM YOUR_TABLE as A
OUTER APPLY
            ( 
              SELECT Information, ID FROM YOUR_TABLE as B WHERE Information LIKE (SELECT '%' + Information + '%' FROM YOUR_TABLE as C WHERE  C.ID = A.ID)
            ) TBL


SELECT Information FROM #FINAL WHERE Id In (SELECT Id from #FINAL GROUP BY Id HAVING COUNT(*) > 1)