【问题标题】:Get the highest conformity between two strings获得两个字符串之间的最高一致性
【发布时间】:2017-05-24 16:21:24
【问题描述】:

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

例如:

string1 = CCC14E0APJ
string2 = CCC14E0APJ123

我的最终结果应该是CCC14E0APJCCC14E0APJ123 的主产品。 我无法进行完全匹配,因为有些产品看起来像这样。

CCC14E0AP
CCC14E0APJ
CCC14E0APK

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

【问题讨论】:

  • 字符串的前缀是否总是一致的,还是会有所不同?
  • 始终同意,所有字符及其顺序都应该完全匹配
  • 为什么CCC14E0APJ123比CCC14E0AP、CCC14E0APK高?
  • 不是。 CCC14E0APJ = 主产品,CCC14E0APJxxxxx = 子产品 x
  • 和CCC14E0APJ & CCC14E0APK的CCC14E0AP主控?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您的解决方案同样有效,但 Shnugo 的解决方案是第一个并且也有效,我无法说出这两种解决方案的优缺点。
    • @jrdev22 在这种情况下,您可以通过点击三角形来投票。投票和接受是 SO 上的两个独立步骤。由于您自己已经跨越了 15 个代表点的边界,因此您需要对您喜欢或不喜欢的任何贡献进行投票。这是在 SO... 上说 Thank you 的方式...快乐编码! (顺便说一句:我这边 +1)
    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多