admin

SQL Server 2008 R2:匹配字符串

sql

我有下表:

表:

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')

预期的输出:我只想显示那些具有重复条目的记录,如果一个字符串与任何字符串的最后一部分匹配,那么我正在考虑将其作为重复。

例如:我有两个字符串

  1. 5sXYZA1010B
  2. A1010B

第二个字符串与第一个字符串的末尾匹配,因此要显示此类记录。

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

预期结果:

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

阅读 262

收藏
2021-07-01

共1个答案

admin

这应该做到(演示

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

但是,如果str_matching有很多行,性能将会很差。在字符串的反面添加索引可以大大改善-如下例所示。

CREATE TABLE str_matching
(
    colstr varchar(200),
    colstr_rev AS REVERSE(colstr)
);

CREATE INDEX ix_colstr_rev on str_matching(colstr_rev)

SELECT colstr = REVERSE(CA.colstr_rev)
FROM   str_matching s1
       JOIN str_matching s2
         ON s1.colstr_rev <> s2.colstr_rev
            AND s2.colstr_rev LIKE  s1.colstr_rev + '%' 
       CROSS APPLY (VALUES(s1.colstr_rev),
                          (s2.colstr_rev)) CA(colstr_rev) 
GROUP BY CA.colstr_rev
2021-07-01