본문 바로가기

오라클

와일드카드

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


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