LIKE 절에서 대괄호를 어떻게 피할 수 있습니까?


236

like를 사용하여 저장 프로 시저로 항목을 필터링하려고합니다. 열은 varchar (15)입니다. 필터링하려는 항목 이름에 대괄호가 있습니다.

예를 들면 다음과 같습니다 WC[R]S123456..

내가하면 LIKE 'WC[R]S123456'아무것도 반환하지 않습니다.

ESCAPE키워드 사용에 대한 정보를 찾았 LIKE지만 대괄호를 일반 문자열로 취급하는 데 키워드 를 사용하는 방법을 이해하지 못합니다.

답변:


328
LIKE 'WC[[]R]S123456' 

또는

LIKE 'WC\[R]S123456' ESCAPE '\'

작동해야합니다.


10
사용자 정의 이스케이프 문자를 사용하려면 ESCAPE 키워드가 필요합니다 (백 슬래시는 실제로 사용자 정의 임).
Ryan Kohn

2
나는 대답의 다른 부분도 수정했다. 이전 및 이후 버전의 SQL Fiddle
Martin Smith

10
대괄호를 이스케이프 처리해야하는 이유가 확실하지 않은 경우 LIKE설명서 에는 범위 또는 세트의 단일 문자와 일치하는 데 사용됩니다. 예를 들어, using LIKE '[fz]oo'은 'foo'및 'zoo'와 모두 일치합니다.
전체적 개발자

3
대답에서 두 가지에 대한 이론적 근거를 갖는 것이 좋을 것입니다. 아래의 Amitesh의 답변을 읽을 때까지 첫 번째 예제가 작동하는 이유는 즉시 분명하지 않았습니다.
Don Jewett

1
LIKE 'WC\[R]S123456' ESCAPE '\'유지 관리가 더 읽기 쉽도록 선호 하십시오.
Fire Druid

119

리터럴과 일치한다고 가정 해 봅시다 its[brac]et.

]와 쌍을 이룰 때만 특별한 의미를 가지므로 이스케이프 할 필요는 없습니다 [.

따라서 탈출 [하면 문제를 해결할 수 있습니다. [ 로 바꾸면 탈출 할 수 있습니다 [[].


7
이것은 정말 도움이되었고 가장 좋은 답변입니다.
Jared Sol

1
[[]이상한 것처럼 보이지만 파서의 관점에서 볼 때 의미가 있습니다. 파서에는 사이의 문자를 처리하는 방법에 대한 특정 규칙이 있습니다 [ ]. 따라서 텍스트 its[brac]et"다음 연속 문자열 찾기 : its, (대괄호에 규칙 적용 :) brac, et"을 의미 합니다. 반면에, its[[]brac]et수단 : "다음 연속 문자열 찾기 : its(대괄호를위한 규칙을 적용 : [) brac]et" .
Brian

28

밑줄로 시작하는 이름을 쿼리에서 제외해야했기 때문에 다음과 같이 끝났습니다.

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character

2
나는이 버전을 사용해야했다.
MarcE

20

내가 실제로 사용한 것은 다음과 같습니다.

like 'WC![R]S123456' ESCAPE '!'

15

ESCAPE 키워드는 일반적으로 와일드 카드 인 % 및 _와 같은 특수 문자를 검색해야하는 경우에 사용됩니다. ESCAPE를 지정하면 SQL은 문자 적으로 % 및 _ 문자를 검색합니다.

몇 가지 예가 더있는 좋은 기사가 있습니다.

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'

6

필자의 경우 와 같이 '_' (밑줄) 과 같은 특수 문자를 이스케이프해야 하고 ESCAPE 절을 정의 할 수 없거나 정의 할 수없는 경우 특수 문자를 대괄호 '[ ''] ' .

이것은 "이상한"문자열 '[[]' 의 의미를 설명합니다 . '[' 문자를 대괄호로 묶어서 효과적으로 이스케이프합니다.

필자의 유스 케이스는 프로파일 러의 필터 기준으로 밑줄이있는 저장 프로 시저의 이름을 지정하는 것이 었습니다. 그래서 나는 문자열 '% name [_] of [_] a [_] 저장 [_] procedure %'를 넣었습니다. TextData LIKE 필드에 으며 달성하려는 추적 결과를 얻었습니다.

다음은 설명서의 좋은 예입니다. LIKE (Transact-SQL)-와일드 카드 문자를 리터럴로 사용


4

설명서 에 따르면 :

와일드 카드 패턴 일치 문자를 리터럴 문자로 사용할 수 있습니다. 와일드 카드 문자를 리터럴 문자로 사용하려면 와일드 카드 문자를 괄호로 묶습니다.

이 세 문자를 이스케이프 처리해야합니다 %_[.

'5%'      LIKE '5[%]'      -- true
'5$'      LIKE '5[%]'      -- false
'foo_bar' LIKE 'foo[_]bar' -- true
'foo$bar' LIKE 'foo[_]bar' -- false
'foo[bar' LIKE 'foo[[]bar' -- true
'foo]bar' LIKE 'foo]bar'   -- true

1

'\'또는 키보드의 다른 문자 대신 키보드에없는 특수 문자를 사용할 수도 있습니다. 사용 사례에 따라 실수로 이스케이프 문자로 사용자 입력을 사용하지 않으려는 경우에 필요할 수 있습니다.


2
내가 자주 사용하는 ¬- 그것은 :) 여전히 영국에서 키보드의 문자입니다하지만 거의 의도적으로 사용하지 (상단 사이의 왼쪽 EscTab)
앤디 모어

사용자는 키보드에없는 문자가 포함 된 데이터를 제출할 수 있습니다. 이 답변은 실제로 문제를 해결하는 것을 피하기위한 제안처럼
보입니다

0

다음을 사용하십시오.

사용자 입력을 그대로 검색하려면 이스케이프를 사용하십시오. 모든 특수 문자 (아래의 모든 SQL Server)를 대체해야합니다.

여기서 작은 따옴표 " '"는 문자열 연결 문제이므로 like 절에 영향을주지 않으므로 사용되지 않습니다.

"-"& "^"& "]"은 "["을 (를) 이스케이프하므로 바꿀 필요가 없습니다.

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

그런 다음 SQL 쿼리에서 다음과 같아야합니다. (매개 변수화 된 쿼리에서 위의 교체 후 패턴으로 문자열을 추가 할 수 있습니다).

정확한 문자열을 검색합니다.

like 'FormattedString' ESCAPE 'ð'

문자열로 시작하여 검색하려면

like '%FormattedString' ESCAPE 'ð'

문자열로 끝을 검색하려면

like 'FormattedString%' ESCAPE 'ð'

문자열로 포함을 검색하려면

like '%FormattedString%' ESCAPE 'ð'

다른 패턴 일치에 대해서도 마찬가지입니다. 그러나 직접 사용자 입력은 위에서 언급 한대로 형식을 지정해야합니다.


0

그 동안 문제가 있습니다.

LIKE 'WC[[]R]S123456' 

과:

LIKE 'WC\[R]S123456' ESCAPE '\'

둘 다 SQL Server에서는 작동하지만 Oracle에서는 작동하지 않습니다.

왼쪽 괄호와 관련된 패턴을 인식하는 ISO / IEC 9075 방법이없는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.