SQL Server 2008 R2:模式匹配字符串,反之亦然

时间:2017-10-30 11:12:27

标签: sql sql-server sql-server-2008-r2

我有下表:

表:

CREATE TABLE str_matching
(
    colstr varchar(200)
);

插入数据:

INSERT INTO str_matching VALUES('5sXYZA1010B')
INSERT INTO str_matching VALUES('A1010B')
INSERT INTO str_matching VALUES('AMZ103B15K')
INSERT INTO str_matching VALUES('B15K')
INSERT INTO str_matching VALUES('XC101')
INSERT INTO str_matching VALUES('C101')
INSERT INTO str_matching VALUES('502KMD1FZ10009L')
INSERT INTO str_matching VALUES('FZ10009L')
INSERT INTO str_matching VALUES('A9L')
INSERT INTO str_matching VALUES('XZ049L')
INSERT INTO str_matching VALUES('LM101')
INSERT INTO str_matching VALUES('9001')
INSERT INTO str_matching VALUES('9001A')

预期输出:我想只显示那些具有重复条目的记录,如果一个字符串匹配任何字符串的最后一部分,那么我认为它是重复的。

情景:1

例如:我有两个字符串

  1. 5sXYZA1010B
  2. A1010B
  3. 在第一个字符串的末尾匹配的第二个字符串,因此要显示这样的记录。

    情景:2

    例如:我有两个字符串

    1. 9001
    2. 9001A
    3. 第一个匹配第一个字符串的第一个字符串,所以要显示这样的记录。

      注意:字符串的长度不固定,可以随时匹配。

      预期结果:

      colstr              
      --------------------
      5sXYZA1010B         
      A1010B              
      AMZ103B15K          
      B15K                
      XC101               
      C101                
      502KMD1FZ10009L     
      FZ10009L    
      9001
      9001A   
      

      注意:需要检查相反的模式匹配。

      根据Martin Smith代码,我已修改为:

      SELECT DISTINCT CA.colstr
      FROM   str_matching s1
             JOIN str_matching s2
               ON s1.colstr <> s2.colstr
                  AND s2.colstr LIKE '%' + s1.colstr 
                  OR s1.colstr LIKE '%' + s2.colstr
             CROSS APPLY (VALUES(s1.colstr),
                                (s2.colstr)) CA(colstr) 
      

      但无法获得给定的字符串集。

2 个答案:

答案 0 :(得分:0)

您只需要修复逻辑:

LIKE

你的ALL ACCOUNTS (${userAccountsData.length}) 模式向后,并且需要在连接条件下使用parens。

答案 1 :(得分:0)

这对我有用:

SELECT DISTINCT CA.colstr
FROM str_matching s1 JOIN
 str_matching s2
 ON s1.colstr <> s2.colstr AND
    (s1.colstr LIKE s2.colstr + '%' OR
     s2.colstr LIKE '%'+ s1.colstr 
    ) CROSS APPLY
 (VALUES(s1.colstr), (s2.colstr)) as CA(colstr) ;