아래의 (단순화 된) 명령을 사용하여 문자열에서 특정 특수 문자를 제거하려고합니다. 검색 후 가장 보편적 인 해결책입니다. 그러나 특정 특수 문자를 사용하면 결과가 일치하지 않습니다. 왜 그 이유를 설명 할 수 있습니까? 그리고 더 나은 방법은 누구나 작동하는 솔루션을 제공 할 수 있습니까? 아래의 첫 번째 경우 특정 특수 문자에 PATINDEX를 사용하여 바꾸기가 실패하는 이유는 무엇입니까?
SQL 서버 2014
은 '@'삭제되지만이 제거되지 않은 경우 (2 + 5)에 포함되어있는 모든 다른 경우이다. 세 번째 경우와 동일 : 공백이 제거되지만 '&'은 삭제되지 않습니다. 다섯 번째 경우에는 공백이 제거되지만 '@'는 제거되지 않습니다. 다른 조합에도 비슷한 문제가 있습니다.감사합니다. 선언 @str의 VARCHAR (50) = '1 번가 @ 1 세인트 FL-3 Rm의 323 & 뉴욕 뉴욕'
declare @Pindex1 varchar(10) = '%[@]%'
declare @Pindex2 varchar(10) = '%[@& ]%'
declare @Pindex3 varchar(10) = '%[& ]%'
declare @Pindex4 varchar(10) = '%[ ]%'
declare @Pindex5 varchar(10) = '%[@ ]%'
Select @str as String, @Pindex1 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex1,@str), 1), '') as PIndex1_result
Select @str as String, @Pindex2 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex2,@str), 1), '') as PIndex2_result
Select @str as String, @Pindex3 as Pattern ,Replace(@str, Substring(@str, PatIndex(@pindex3,@str), 1), '') as PIndex3_result
Select @str as String, @Pindex4 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex4,@str), 1), '') as PIndex4_result
Select @str as String, @Pindex5 as Pattern,Replace(@str, Substring(@str, PatIndex(@pindex5,@str), 1), '') as PIndex5_result
예상 한 내용이 확실하지 않습니다. 대부분의 패턴이 여러 가능한 문자와 일치 할 수 있으며, 매번 첫 번째 일치 항목을 찾을 때마다 'patindex'가 문자열에서 발견 된 문자를 '대체'합니다. 분명히 다른 가능한 일치 (패턴이 일치 할 수있는 다른 문자)는 문자열을 그대로 유지합니다. 두 번째 패턴이 유효하지 않습니다 ('@'에서'space '로 범위를 정의하려고합니다.'% [- @] % ''이어야합니다), 마지막 패턴도 유효하지 않습니다 (''% [@] % ''), 패턴을 고정한다고해서 패턴을 한 번만 구체화하는 문제는 해결되지 않습니다. – GSerg
'PatIndex'가 더 이상 일치하는 것을 찾을 때까지 반복 할 필요가 있습니다. – GSerg
필자가 보았던 것에서 반복은 불필요합니다. [] 안에있는 문자의 모든 인스턴스와 반복적으로 일치합니다. (나는 범위 함수를 사용하려고하지 않고 있는데, 이것은 나의 예에서 실수였다. 편집 된 질문을 참조하라.) 그것은 우리의 테스트에서 다양한 문자로 발생하지만 '@'문자로는 발생하지 않는다. – LBerg