我有下表:
表:
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')
预期的输出:我只想显示那些具有重复条目的记录,如果一个字符串与任何字符串的最后一部分匹配,那么我正在考虑将其作为重复。
例如:我有两个字符串
5sXYZA1010B
A1010B
第二个字符串与第一个字符串的末尾匹配,因此要显示此类记录。
注意 :字符串的长度不是固定的,可以随时匹配。
预期结果:
colstr -------------------- 5sXYZA1010B A1010B AMZ103B15K B15K XC101 C101 502KMD1FZ10009L FZ10009L
这应该做到(演示)
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有很多行,性能将会很差。在字符串的反面添加索引可以大大改善-如下例所示。
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