2017-10-30 1 views
0

나는이 다음 표 :SQL 서버 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
1 문자열의 끝에서 일치한다

2 문자열, 그래서 원하는 그러한 레코드를 표시합니다.

시나리오 : 예를 들어 2

: 나는 두 문자열

  1. 9001
  2. 9001A
2 문자열의 처음에 일치한다

1 문자열, 그래서 원하는 그러한 레코드를 표시합니다.

참고 : 문자열의 길이는 고정되어 있지 않으며 어느 시점이든 일치 할 수 있습니다.

예상 결과 :

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) 

그러나 없습니다 Martin Smith 코드 당으로

, 나는에 수정했습니다.

답변

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) ; 
0

당신은 당신의 논리를 수정해야합니다

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 패턴이 있고 조인 조건의 주위에 괄호가 필요했다.

+0

이 변경 사항에 대해 확실 해요. – MAK

+0

@MAK. . . 그것은 당신이 묻고있는 질문의 구현 인 것 같습니다. –