SQL Server 2008 R2:模式匹配字符串反之亦然
SQL Server 2008 R2: Pattern matching string vice versa
我有以下 table:
Table:
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
例如:我有两个字符串
5sXYZA1010B
A1010B
第二个字符串在第一个字符串的末尾匹配,所以要显示这样的记录。
场景:2
例如:我有两个字符串
9001
9001A
第一个字符串在第二个字符串的开头匹配,所以要显示这样的记录。
注意:字符串的长度不固定,可以任意匹配。
预期结果:
colstr
--------------------
5sXYZA1010B
A1010B
AMZ103B15K
B15K
XC101
C101
502KMD1FZ10009L
FZ10009L
9001
9001A
注意:需要勾选反之模式匹配。
根据代码,我修改为:
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)
但无法获取给定的字符串集。
你只需要修正你的逻辑:
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)) as CA(colstr) ;
您的 LIKE
模式是倒过来的,需要在连接条件周围加上括号。
这对我有用:
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) ;
我有以下 table:
Table:
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
例如:我有两个字符串
5sXYZA1010B
A1010B
第二个字符串在第一个字符串的末尾匹配,所以要显示这样的记录。
场景:2
例如:我有两个字符串
9001
9001A
第一个字符串在第二个字符串的开头匹配,所以要显示这样的记录。
注意:字符串的长度不固定,可以任意匹配。
预期结果:
colstr
--------------------
5sXYZA1010B
A1010B
AMZ103B15K
B15K
XC101
C101
502KMD1FZ10009L
FZ10009L
9001
9001A
注意:需要勾选反之模式匹配。
根据
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)
但无法获取给定的字符串集。
你只需要修正你的逻辑:
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)) as CA(colstr) ;
您的 LIKE
模式是倒过来的,需要在连接条件周围加上括号。
这对我有用:
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) ;