[sql-server] LIKE 식에서 안전하게 사용할 수 있도록 SQL Server에서 문자열을 이스케이프합니다.

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 '!'


답변

대체 이스케이프 구문 :

LIKE 와일드 카드 리터럴

JDBC 드라이버는 LIKE 절 와일드 카드를 리터럴로 사용하기 위해 {escape ‘escape character’} 구문을 지원합니다 .

SELECT *
FROM tab
WHERE col LIKE 'a\_c' {escape '\'};

db <> 바이올린 데모


답변