代码之家  ›  专栏  ›  技术社区  ›  V Krishan

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

  •  0
  • V Krishan  · 技术社区  · 8 年前

    我试图在列中查找重复项,其中数据表示相同的内容,但在处理过程中未正确规范化。 我建立了一个#表,其中有两个关键字段可供搜索。 我不想修剪或操纵专栏,而是想带回任何匹配项>共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 回复  |  直到 8 年前
        1
  •  0
  •   Mazhar    8 年前

    这里有一个解决方案。 这使用 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
    
        2
  •  0
  •   LONG    8 年前

    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)
    
    推荐文章