sqler.com/260455 글 퍼왔습니다.
안녕하세요?
MSSQL 에서 와일드카드라 하면 흔히들 "%"를 많이 생각하시는데요,
이거 이외에도 크게 두가지가 더 있고, 이로 인해서 문제가 발생할 수도 있습니다.
CREATE TABLE LIKE_TEST
(
PKEY INT PRIMARY KEY,
DETAIL VARCHAR(200)
)
INSERT INTO LIKE_TEST (PKEY, DETAIL) VALUES (1, '나의 살던 고향은 꽃피는 산골')
INSERT INTO LIKE_TEST (PKEY, DETAIL) VALUES (2, '나의 살던 [고향은] 꽃피는 산골')
INSERT INTO LIKE_TEST (PKEY, DETAIL) VALUES (3, '나의 살던 고향은 꽃피는 시골')
INSERT INTO LIKE_TEST (PKEY, DETAIL) VALUES (4, '나의 살_ 고향은 꽃피는 사골')
INSERT INTO LIKE_TEST (PKEY, DETAIL) VALUES (5, '13579')
INSERT INTO LIKE_TEST (PKEY, DETAIL) VALUES (6, 'ZACEF')
INSERT INTO LIKE_TEST (PKEY, DETAIL) VALUES (7, '1D3FB')
INSERT INTO LIKE_TEST (PKEY, DETAIL) VALUES (8, '3^F57')
INSERT INTO LIKE_TEST (PKEY, DETAIL) VALUES (9, 'CA10%')
1. %
가장 많이 사용하는 와일드카드 입니다. 모든 문자를 포함한다고 보시면 됩니다.
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '나의%';
결과
-------------------------------------------------------
PKEY DETAIL
1 나의 살던 고향은 꽃피는 산골
2 나의 살던 [고향은] 꽃피는 산골
3 나의 살던 고향은 꽃피는 시골
4 나의 살_ 고향은 꽃피는 사골
-------------------------------------------------------
* 아시다시피 INDEX가 있는 컬럼인경우 '~%'와 같이 사용하시면 인덱스를 사용하실 수 있지만, '%~'와 같이 사용하시면 인덱스를 사용할 수 없습니다.
2. _
해당하는 글자만큼의 와일드카드입니다. "_"를 사용한 만큼의 문자만 적용됩니다.
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '나의 살_ 고향은 꽃피는 _골';
결과--> 앞부분의 "_"는 "던"과 "_"가 뒷부분의 "_"는 "산골"과 "시골"이 이에 해당합니다.
-------------------------------------------------------
PKEY DETAIL
1 나의 살던 고향은 꽃피는 산골
3 나의 살던 고향은 꽃피는 시골
4 나의 살_ 고향은 꽃피는 사골
-------------------------------------------------------
3. [ ] 패턴일치
해당하는 패턴(정규식) 집합 안에 포함되는 하나의 문자와 일치합니다.
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '[0-9][0-9][0-9]%';
결과--> 앞의 세글자가 각각 숫자인 것을 찾아냅니다.
-------------------------------------------------------
PKEY DETAIL
5 13579
-------------------------------------------------------
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '%[A-Z]%';
결과--> 문자열 중 A-Z 사이, 즉 영문자가 있는 것을 찾아냅니다.
-------------------------------------------------------
PKEY DETAIL
6 ZACEF
7 1D3FB
8 3^F57
9 CA10%
-------------------------------------------------------
4. [ ] 패턴 제외
해당하는 패턴(정규식) 집합 안에 포함되지 않는 하나의 문자와 일치합니다.
제가 쓰고 나서 봐도 좀 어렵네요.
쉽게 말하면 그 글자를 포함하지 않는 문자열을 찾아낸다고 보시면 될 듯.
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '[^0-9]%';
결과--> 앞의 첫 글자가 숫자가 아닌 것을 찾아냅니다.
-------------------------------------------------------
PKEY DETAIL
1 나의 살던 고향은 꽃피는 산골
2 나의 살던 [고향은] 꽃피는 산골
3 나의 살던 고향은 꽃피는 시골
4 나의 살_ 고향은 꽃피는 사골
6 ZACEF
9 CA10%
-------------------------------------------------------
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '[^A-Z]%';
결과--> 시작 문자열 중 A-Z 사이가 아닌것, 즉 영문자로 시작하지 않는 것을 찾아냅니다.
-------------------------------------------------------
PKEY DETAIL
1 나의 살던 고향은 꽃피는 산골
2 나의 살던 [고향은] 꽃피는 산골
3 나의 살던 고향은 꽃피는 시골
4 나의 살_ 고향은 꽃피는 사골
5 13579
7 1D3FB
8 3^F57
-------------------------------------------------------
아래 내용은 Help에 있는 내용입니다.
-------------------------------------------------------
· LIKE 'Mc%'는 Mc로 시작하는 모든 문자열을 검색합니다(예: McBadden).
· LIKE '%inger'는 inger로 끝나는 모든 문자열을 검색합니다(예: Ringer, Stringer).
· LIKE '%en%'는 문자열의 어느 위치에든 en이 포함된 모든 문자열을 검색합니다(예: Bennet, Green, McBadden).
· LIKE '_heryl'는 heryl로 끝나고 6자로 된 모든 이름을 검색합니다(예: Cheryl, Sheryl).
· LIKE '[CK]ars[eo]n'는 Carsen, Karsen, Carson, Karson을 검색합니다.
· LIKE '[M-Z]inger'는 M에서 Z 사이의 한 문자로 시작하고 inger로 끝나는 모든 이름을 검색합니다(예: Ringer).
· LIKE 'M[^c]%'는 M으로 시작하고 두 번째 문자가 c가 아닌 모든 이름을 검색합니다(예: MacFeather).
-------------------------------------------------------
알고 나면 참 편리하죠?
참으로 편리해 보이지만, 한 가지 문제가 있습니다.
바로... 와일드카드 문자를 검색할 때입니다.
이는 DB 검색을 할 때 흔히 실수하는 부분입니다.
실례로 제목에 대괄호([~~~~])를 사용하는 경우가 많은데요.
여기 샘플에서는 "2, 나의 살던 [고향은] 꽃피는 산골" 이 그러합니다.
자, 아래와 같이 검색을 해보겠습니다.
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '%[%';
결과--> ????
-------------------------------------------------------
PKEY DETAIL
-------------------------------------------------------
슬프게도 결과가 나오지 않습니다.
그럼, 와일드카드 문자는 검색을 할 수 없단 말인가요? ㅜ.ㅜ
아닙니다! 기본적으로는 대괄호로 묶어 주면 됩니다.
이제 바꿔보겠습니다.
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '%[[]%';
결과--> 짜잔~
-------------------------------------------------------
PKEY DETAIL
2 나의 살던 [고향은] 꽃피는 산골
-------------------------------------------------------
나옵니다. ㅋ.
이제, 와일드카드 문자 검색을 정리해 보면 다음과 같습니다.
1. ESCAPE 문자지정
- ESCAPE 문자를 지정해 줍니다. 그 문자는 예약어만 아니면 다 가능합니다.
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '%10#%%' ESCAPE '#';
결과--> 10#%를 10%로 찾아냅니다.
-------------------------------------------------------
PKEY DETAIL
9 CA10%
-------------------------------------------------------
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '%10/%%' ESCAPE '/';
결과--> 10/%를 10%로 찾아냅니다.
-------------------------------------------------------
PKEY DETAIL
9 CA10%
-------------------------------------------------------
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '%/^%' ESCAPE '/';
결과--> /^를 ^로 찾아냅니다.
-------------------------------------------------------
PKEY DETAIL
8 3^F57
-------------------------------------------------------
2. 대괄호 사용
- [] 안에 와일드카드를 넣습니다.
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '%[%]%';
결과--> % 가 포함된 문자열을 찾아냅니다.
-------------------------------------------------------
PKEY DETAIL
9 CA10%
-------------------------------------------------------
SELECT * FROM LIKE_TEST WHERE DETAIL LIKE '%[[]%';
결과--> [ 가 포함된 문자열을 찾아냅니다.
-------------------------------------------------------
PKEY DETAIL
2 나의 살던 [고향은] 꽃피는 산골
-------------------------------------------------------
* 참고로 ^가 포함된 문자는 ESCAPE 로 찾아내야 합니다.
특히, 제목에 대괄호[~~~]를 사용하는 경우가 많다는 것을 잊지 마시고,
PROCEDURE를 만들면서 제목 검색을 할 때에는 반드시 유의해야 할 듯 합니다.^^
'Dev. 데이터베이스 > Mssql 관련' 카테고리의 다른 글
[MSSQL] 사용자 정의 함수(function)에서 varchar 데이터 형식 사용시 유의사항 (0) | 2013.08.30 |
---|---|
[MSSQL] 사용자 정의 function 사용시 유의 사항 (0) | 2013.08.30 |
마감시간으로 주문일자 가져오기 (0) | 2012.03.30 |
mssql 날짜 형식 변환 ( convert ) (0) | 2012.03.30 |
mssql 화폐단위 문자열로 형변환 ( money -> string ) (0) | 2012.03.27 |