2017-05-15 6 views
1

아래의 (단순화 된) 명령을 사용하여 문자열에서 특정 특수 문자를 제거하려고합니다. 검색 후 가장 보편적 인 해결책입니다. 그러나 특정 특수 문자를 사용하면 결과가 일치하지 않습니다. 왜 그 이유를 설명 할 수 있습니까? 그리고 더 나은 방법은 누구나 작동하는 솔루션을 제공 할 수 있습니까? 아래의 첫 번째 경우 특정 특수 문자에 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 
+0

예상 한 내용이 확실하지 않습니다. 대부분의 패턴이 여러 가능한 문자와 일치 할 수 있으며, 매번 첫 번째 일치 항목을 찾을 때마다 'patindex'가 문자열에서 발견 된 문자를 '대체'합니다. 분명히 다른 가능한 일치 (패턴이 일치 할 수있는 다른 문자)는 문자열을 그대로 유지합니다. 두 번째 패턴이 유효하지 않습니다 ('@'에서'space '로 범위를 정의하려고합니다.'% [- @] % ''이어야합니다), 마지막 패턴도 유효하지 않습니다 (''% [@] % ''), 패턴을 고정한다고해서 패턴을 한 번만 구체화하는 문제는 해결되지 않습니다. – GSerg

+0

'PatIndex'가 더 이상 일치하는 것을 찾을 때까지 반복 할 필요가 있습니다. – GSerg

+0

필자가 보았던 것에서 반복은 불필요합니다. [] 안에있는 문자의 모든 인스턴스와 반복적으로 일치합니다. (나는 범위 함수를 사용하려고하지 않고 있는데, 이것은 나의 예에서 실수였다. 편집 된 질문을 참조하라.) 그것은 우리의 테스트에서 다양한 문자로 발생하지만 '@'문자로는 발생하지 않는다. – LBerg

답변

1

난 당신이 SQL 서버 패턴의 오해가있을 수 있습니다 생각합니다. 두 번째 패턴을 고려해보십시오.

declare @Pindex2 varchar(10) = '%[@- ]%' 

패턴과 일치하지 않을 수 있습니다. 왜? '@'의 ASCII 값은 64이며 공백은 32입니다.이 값 사이에는 아무 것도 나타나지 않습니다. '%[b-a]%'과 유사하며 아무 것도 일치하지 않습니다.

SQL Server 문자열 패턴에 대한 이해가 문제라고 생각합니다.

+0

지금 '-'문자 문제가 있습니다. 나는 범위를 위해 노력하지 않고 있었다 (그것은 '-'가하는 것이다). 내가 교체 할 [] 안에있는 각 문자를 찾으려고했습니다. 이 문제를 더 잘 보여주기 위해 예제를 약간 편집했습니다. – LBerg