MSSQL 와일드카드를 이용한 검색과 주의점 -- MSSQL



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를 만들면서 제목 검색을 할 때에는 반드시 유의해야 할 듯 합니다.^^


출처 : http://lucyora.egloos.com/5635099


덧글

댓글 입력 영역