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

Get the highest conformity between two strings

Levenshtein 函数是 correct/best 函数,用于查找两个字符串之间的最高一致性吗?

例如:

string1 = CCC14E0APJ
string2 = CCC14E0APJ123

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

CCC14E0AP
CCC14E0APJ
CCC14E0APK

它们都是完全不同的产品。 master 始终是找到的最长字符串的 100% 匹配字符串。 对于产品abcde123,如果我的mastertable里面有abcde,那就是master。只有abc才是高手

您不需要花哨的如何关闭字符串函数,而是将字符串的开头与所有其他字符串进行比较,如果它们以相同的字符串。如果是这样,较短的是较长的 parent...

通过以下查询,您将获得 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

对于每一行,您只需使用 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