select * from ... where 절에서 가장 많이 쓰이는 연산자 중의 하나는 바로 "LIKE" 문일 것이다.
Like 문을 이용해서 '%문자열%' 원하는 문자열이 포함되어 있는 컬럼을 쉽고 간편하게 검색할 수 있다.
그러나!! 우리가 많이 쓰는 Like 문에도 헛점이 있다.
SELECT * FROM _TTFID
WHERE Context LIKE '%test5%'
WHERE Context LIKE '%test5%'
결과는 우리가 예상한데로 다음과 같이 출력되었다.
이쯤 되면, "어라? 제대로 잘되는데 뭐가 문제라는 거야?" 라고 반문하시는 분들도 계실것이고, 다음의 문제점을 미리 예측하신 분들도 계실것 입니다.
자 그럼 문제의 쿼리로 넘어가 볼까요?
SELECT * FROM _TTFID
WHERE Context LIKE '[test5%'
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]'
WHERE Context = '[test5]'
LIKE 연산자가 대괄호로 시작되는 첫번째 문장을 지정된 범위 또는 집합을 선택하는 와일드카드로 인식했던 것이었습니다.
따라서 DB 내용 입력시 첫번째 문자열은 되도록 특수기호를 피하여 입력하는 것이 좋겠습니다. ^^
그래도 "나는 Like 문으로 꼭 '['로 시작하는 context를 검색하고 말테야!"라고 혈서로 맹세하시는 분들을 위해서 다음의 방법을 알려드립니다.
SELECT * FROM _TTFID
WHERE Context LIKE '[[]test5%'
WHERE Context LIKE '[[]test5%'
[ 와일드카드 문자 ] <- 이와 같이 와일드카드 문자를 대괄호로 양쪽에서 감싸주시면 해결됩니다.
덧글을 달아 주세요
elther 2008/12/26 14:29 고유주소 고치기 답하기
잘 보고 갑니다
꼭 [[] 이런식으로 검색하는 사람이 있다면
그사람은 변태일거에요
헐 2011/05/27 14:23 고유주소 고치기 답하기
잘 보고 갑니다
제가 그 변태네요.
TTF 2011/05/31 22:58 고유주소 고치기
변태 (變態) [변ː태]
[명사]
1. 본래의 형태가 변하여 달라짐. 또는 그런 상태. ‘탈바꿈’으로 순화.
2. 정상이 아닌 상태로 달라짐. 또는 그 상태.
몰랐던 사실에 대해서 알게 되셨기 때문에
변태 상태에서 정상으로 복귀 하셨습니다. ^^