LIKE
표현식 에서 안전하게 사용할 수 있도록 SQL Server의 저장 프로 시저에서 문자열을 이스케이프하려면 어떻게해야합니까?
다음 NVARCHAR
과 같은 변수 가 있다고 가정합니다 .
declare @myString NVARCHAR(100);
그리고 LIKE
식에서 사용하고 싶습니다 .
... WHERE ... LIKE '%' + @myString + '%';
T-SQL에서 문자열 (더 구체적으로는 LIKE
패턴 일치에 의미있는 문자 , 예를 들어 %
또는 ?
)을 어떻게 이스케이프하여 이러한 방식으로 사용하는 것이 안전합니까?
예를 들면 다음과 같습니다.
@myString = 'aa%bb'
내가 원하는:
WHERE ... LIKE '%' + @somehowEscapedMyString + '%'
일치합니다 'aa%bb'
, 'caa%bbc'
하지만 'aaxbb'
나 'caaxbb'
.
답변
LIKE 표현식에서 특수 문자를 이스케이프하려면 이스케이프 문자를 접 두부로 붙입니다. ESCAPE 키워드와 함께 사용할 이스케이프 문자를 선택해야합니다. ( MSDN 참조 )
예를 들어 이스케이프 문자로 \를 사용하여 % 기호를 이스케이프합니다.
select * from table where myfield like '%15\% off%' ESCAPE '\'
문자열에 어떤 문자가 포함 될지 모르고 와일드 카드로 취급하지 않으려면 모든 와일드 카드 문자 앞에 이스케이프 문자를 붙일 수 있습니다. 예 :
set @myString = replace(
replace(
replace(
replace( @myString
, '\', '\\' )
, '%', '\%' )
, '_', '\_' )
, '[', '\[' )
(이스케이프 문자도 이스케이프해야 replace
하며 다른 replace
문 에서 추가 된 항목을 이스케이프하지 않도록 내부 문자인지 확인해야합니다 .) 그런 다음 다음과 같이 사용할 수 있습니다.
select * from table where myfield like '%' + @myString + '%' ESCAPE '\'
또한 @myString 변수는 문자열 교체로 더 길어 지므로 더 많은 공간을 할당해야합니다.
답변
비슷한 문제 (NHibernate를 사용하므로 ESCAPE 키워드가 매우 어려웠을 것임)가 있었고 대괄호 문자를 사용하여 해결했습니다. 그래서 당신의 샘플은
WHERE ... LIKE '%aa[%]bb%'
증거가 필요한 경우 :
create table test (field nvarchar(100))
go
insert test values ('abcdef%hijklm')
insert test values ('abcdefghijklm')
go
select * from test where field like 'abcdef[%]hijklm'
go
답변
패턴에서 선행 와일드 카드를 사용하는 경우 패턴 구문에서 특별한 의미가있는 문자열의 모든 문자를 이스케이프 하는 것보다 더 빠르고 쉽게 수행 할 수 있습니다.
SELECT *
FROM YourTable
WHERE CHARINDEX(@myString , YourColumn) > 0
선행 와일드 카드를 사용하지 않는 경우 위의 접근 방식은에서 인덱스를 사용할 수 없으므로 피해야합니다 YourColumn
.
또한 최적의 실행 계획 사용시 추정치 좋을 수도 매칭 행의 수에 따라 달라질 수있는 경우 LIKE
에 비해 구문 탈출 대괄호로 모두CHARINDEX
와 키워드 .ESCAPE
답변
이스케이프 문자를 지정합니다. 여기에 문서화 :
http://msdn.microsoft.com/en-us/library/ms179859.aspx
답변
이스케이프 문자가 포함 된 문자열을 찾으시겠습니까? 예를 들어 다음을 원합니다.
select * from table where myfield like '%10%%'.
10 %가 포함 된 모든 필드를 어디에서 검색 하시겠습니까? 이 경우 ESCAPE 절을 사용하여 이스케이프 문자를 지정하고 와일드 카드 문자를 이스케이프 할 수 있습니다.
select * from table where myfield like '%10!%%' ESCAPE '!'
답변
대체 이스케이프 구문 :
JDBC 드라이버는 LIKE 절 와일드 카드를 리터럴로 사용하기 위해 {escape ‘escape character’} 구문을 지원합니다 .
SELECT *
FROM tab
WHERE col LIKE 'a\_c' {escape '\'};