获得两个字符串之间的最高一致性

时间:2017-01-10 08:33:12

标签: sql-server sql-server-2008 tsql sql-server-2014 string-comparison

Levenshtein函数是否是正确/最佳函数,以找到两个字符串之间的最高一致性?

例如:

string1 = CCC14E0APJ
string2 = CCC14E0APJ123

我的最终结果应该说CCC14E0APJCCC14E0APJ123的主要产品。 我不能完全匹配,因为有些产品看起来像这样。

CCC14E0AP
CCC14E0APJ
CCC14E0APK

这些都是完全不同的产品。 对于找到的最长字符串,master始终是100%匹配的字符串。 对于产品abcde123,如果我的主表中有一个abcde,那就是master。如果只有abc,那就是主人。

2 个答案:

答案 0 :(得分:4)

你不需要花哨的 How-close-is-the-string -functions,而是将字符串的开头与所有其他字符串进行比较,如果它们以相同的字符串开头。如果是这样,则较长的越短......

使用以下查询,您将获得 ParentID ,即使在分层系统中也是如此:

DECLARE @dummy TABLE(YourID VARCHAR(100),ParentID VARCHAR(100));

INSERT INTO @dummy(YourID) VALUES
 ('CCC14E0AP')
,('CCC14E0APJ')
,('CCC14E0APK')
,('CCC14E0APK_1')
,('CCC14E');

WITH DependingIDs AS
(
    SELECT d.ParentID
          ,d.YourID
          ,d2.YourID AS dependingID
          ,RANK() OVER(PARTITION BY d.YourID ORDER BY LEN(d2.YourID) DESC) AS NextLenght
    FROM @dummy AS d
    INNER JOIN @dummy AS d2 ON d.YourID LIKE d2.YourID + '%' AND d.YourID<>d2.YourID
)
UPDATE DependingIDs SET ParentID=dependingID
WHERE NextLenght=1;

SELECT * FROM @dummy

这是结果

YourID       ParentID
CCC14E0AP    CCC14E
CCC14E0APJ   CCC14E0AP
CCC14E0APK   CCC14E0AP
CCC14E0APK_1 CCC14E0APK
CCC14E       NULL

答案 1 :(得分:3)

对于每一行,您只需使用APPLY运算符检测最大子字符串:

DECLARE @t TABLE ( p VARCHAR(MAX) );

INSERT  INTO @t
VALUES  ( 'A' ),
        ( 'AAAA' ),
        ( 'AA' ),
        ( 'BBB' ),
        ( 'BBBB' ),
        ( 'BBBBB' ),
        ( 'BBBBB' ),
        ( 'C' )

SELECT  *
FROM    @t t
        OUTER APPLY ( SELECT TOP 1 p
                      FROM      @t
                      WHERE     t.p <> p AND t.p LIKE p + '%'
                      ORDER BY  LEN(p) DESC
                    ) ca

输出:

A       NULL
AAAA    AA
AA      A
BBB     NULL
BBBB    BBB
BBBBB   BBBB
BBBBB   BBBB
C       NULL