[MS-SQL] like 사용시 주의할 점

select * from ... where 절에서 가장 많이 쓰이는 연산자 중의 하나는 바로 "LIKE" 문일 것이다.

Like 문을 이용해서 '%문자열%' 원하는 문자열이 포함되어 있는 컬럼을 쉽고 간편하게 검색할 수 있다.

그러나!! 우리가 많이 쓰는 Like 문에도 헛점이 있다.

위와 같은 테이블이 있을 경우에 다음과 같은 test5에 해당하는 문장을 선택하기 위하여 다음의 쿼리를 질의 하였다.
SELECT * FROM _TTFID
WHERE Context LIKE '%test5%'

결과는 우리가 예상한데로 다음과 같이 출력되었다.

이쯤 되면, "어라? 제대로 잘되는데 뭐가 문제라는 거야?" 라고 반문하시는 분들도 계실것이고, 다음의 문제점을 미리 예측하신 분들도 계실것 입니다.

자 그럼 문제의 쿼리로 넘어가 볼까요?
SELECT * FROM _TTFID
WHERE Context LIKE '[test5%'

분명히 LIKE 문 다음에 '[test5' 이후에 일치하는 모든 결과를 보여줘!! 라고 질의했습니다.
결과는 다음과 같습니다.

엥? 결과가 하나도 안나오네 -_-; 뭐지? 뭘 잘못한거지? 이렇게 당황하셨다면 SQL 도움말에서 like문을 찾아보세요.

와일드카드 문자설명예제
%문자가 0개 이상인 문자열WHERE title LIKE '%computer%'는 책 제목에 'computer' 단어가 있는 모든 책 제목을 찾습니다.
_ (밑줄)단일 문자WHERE au_fname LIKE '_ean'은 ean으로 끝나는 모든 4문자 이름을 찾습니다(Dean, Sean 등).
[ ]지정된 범위([a-f]) 또는 집합([abcdef])에 있는 단일 문자WHERE au_lname LIKE '[C-P]arsen'은 arsen으로 끝나고 C와 P 사이의 단일 문자로 시작하는 저자의 성을 찾습니다. 예를 들면, Carsen, Larsen, Karsen 등입니다.
[^]지정된 범위([^a-f]) 또는 집합([^abcdef])에 없는 단일 문자WHERE au_lname LIKE 'de[^l]%'은 de로 시작하고 그 다음에 오는 문자가 l이 아닌 저자의 성을 모두 찾습니다.


와일드 카드 문자를 주목해서 보시면 눈치 빠르신 분들은 아! 저거였구나! 하실 것 입니다.
문제는 바로 "[" 문자가 와일드카드 문자였다는 것입니다.

만약 질의문을 다음과 같이 했다면 문제가 없었겠지만, 우리는 like 연산자를 이용하여 질의를 하였습니다.
SELECT * FROM _TTFID
WHERE Context = '[test5]'

LIKE 연산자가 대괄호로 시작되는 첫번째 문장을 지정된 범위 또는 집합을 선택하는 와일드카드로 인식했던 것이었습니다.

따라서 DB 내용 입력시 첫번째 문자열은 되도록  특수기호를 피하여 입력하는 것이 좋겠습니다. ^^

그래도 "나는 Like 문으로 꼭 '['로 시작하는 context를 검색하고 말테야!"라고 혈서로 맹세하시는 분들을 위해서 다음의 방법을 알려드립니다.
SELECT * FROM _TTFID
WHERE Context LIKE '[[]test5%'

[ 와일드카드 문자 ] <- 이와 같이 와일드카드 문자를 대괄호로 양쪽에서 감싸주시면 해결됩니다.
2007/12/19 00:58 2007/12/19 00:58

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요

  1. elther 2008/12/26 14:29 고유주소 고치기 답하기

    잘 보고 갑니다
    꼭 [[] 이런식으로 검색하는 사람이 있다면
    그사람은 변태일거에요

  2. 2011/05/27 14:23 고유주소 고치기 답하기

    잘 보고 갑니다
    제가 그 변태네요.

    • TTF 2011/05/31 22:58 고유주소 고치기

      변태 (變態) [변ː태]
      [명사]
      1. 본래의 형태가 변하여 달라짐. 또는 그런 상태. ‘탈바꿈’으로 순화.
      2. 정상이 아닌 상태로 달라짐. 또는 그 상태.

      몰랐던 사실에 대해서 알게 되셨기 때문에
      변태 상태에서 정상으로 복귀 하셨습니다. ^^