MSSQL 와일드카드 :: 소림사의 홍반장!

MSSQL 와일드카드

2012. 3. 26. 22:49 - 삘쏘굿

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 관련 카테고리의 포스트를 톺아봅니다