MSSQL LIKE 문자열 부분일치, 패턴 검색 총정리

문자열 부분일치, 패턴 검색 이란?

우리가 흔히 검색을 할 때 검색한 단어와 똑같은 내용에 해당하는 결과물이 출력되지만

동시에 해당 검색어가 포함된 다른 단어나 문장들도 함께 검색이 됩니다.

 

예를 들어 '감자'라고 검색을 하면 정확하게 '감자'에 대한 내용이 검색되기도 하지만

'돼지감자', '감자채 볶음', '감자를 심었다' 등 '감자'가 들어간 다른 문자열도 검색이 됩니다.

 

위와 같은 형태로 검색어와 검색대상 문자열이 부분만 일치하거나,

'감자'로 시작하는 문자열만 다 검색해 처럼 특정패턴에 일치하는 경우 조회되게 하는 방법이

LIKE문을 사용한 문자열 부분일치, 패턴 검색 방법입니다.

 

LIKE문  문법

SELECT * FROM 테이블 WHERE 칼럼 LIKE 패턴

LIKE문은 WHERE절에 사용되며 검색을 원하는 칼럼(문자열)에 패턴조건에 부합하는 결과가 출력되게 됩니다.

그래서 패턴을 적절히 작성하면 다양한 형태의 검색결과를 유도할 수 있습니다.

 

LIKE문  패턴

패턴에는 와일드카드 문자를 활용해 작성합니다. '%, _, [ ], [^]' 이렇게 4종류의 와일드카드 문자가 있습니다.

하나하나 살펴보겠습니다.

 

% (0개 이상의 문자를 가진 문자열)

패턴에 '%' 문자가 들어가면 와일드카드 문자로 인식되어, 해당문자는 '0개 이상의 문자를 가진 문자열'을 의미하게 됩니다.

예시를 통해 쉽게 이해해 보겠습니다.

SELECT * FROM 테이블 WHERE NAME SEARCH_TEXT '%감자%'
/* 
    SEARCH_TEXT 칼럼에 '감자' 라는 문자가 포함된 모든 데이터가 출력됩니다.
    EX) '감자', '돼지감자', '감자채', '감자전', '감자를 심었다', '큰 감자 밭', ...
*/

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '감자%'
/*
    SEARCH_TEXT 칼럼에 '감자' 라는 문자로 시작하는 모든 데이터가 출력됩니다.
    '감자' 앞에 다른문자가 있는경우 조건에 부합하지 않아 출력되지 않습니다.
    EX) '감자', '감자채', '감자전', '감자를 심었다', ...
*/

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '%감자'
/*
    SEARCH_TEXT 칼럼에 '감자' 라는 문자로 끝나는 모든 데이터가 출력됩니다.
    '감자' 뒤에 다른 문자가 있는경우 조건에 부합하지 않아 출력되지 않습니다.
    EX) '감자', '돼지감자', ...
*/

_ (단일문자 1개)

패턴에 '_' 문자가 들어가면 와일드카드 문자로 인식되어, 해당문자는 '단일문자 1개'를 의미하게 됩니다.

예시를 통해 쉽게 이해해 보겠습니다.

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '감자_'
/*
    SEARCH_TEXT 칼럼에 '감자' 라는 문자로 시작되며 뒤에 글자가 1개 있는 데이터가 출력됩니다.
    EX) '감자채', '감자전', ...
*/

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '__감자' -- 앞쪽 언더바 2개
/*
    SEARCH_TEXT 칼럼에 '감자' 라는 문자로 끝나게되며 앞에 글자가 2개 있는 데이터가 출력됩니다.
    EX) '돼지감자', ...
*/

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '__감자__' -- 양쪽 언더바 2개
/*
    SEARCH_TEXT 칼럼에 '감자' 라는 문자가 가운데 있게되며 
    앞,뒤로 글자가 2개씩 있는 데이터가 출력됩니다.
    EX) '큰 감자 밭', ...
*/

[문자범위 또는 문자들] (지정된 문자범위 또는 문자들에 해당하는 단일문자 1개)

패턴에 '[ ]' 문자가 들어가면 와일드카드 문자로 인식되어, '해당괄호 내 문자범위 또는 문자들에 해당하는 단일문자 1개'를 의미합니다.

예시를 통해 쉽게 이해해 보겠습니다.

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '감자[채반자주]'
/*
    SEARCH_TEXT 칼럼에 '감자'로 시작하여 
    뒤에 '채' OR '반' OR '자' OR '주' 한글자가 오는 데이터가 조회됩니다.
    EX) '감자채', ...
*/

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '감자[ㄱ-ㅎ]'
/*
    SEARCH_TEXT 칼럼에 '감자'로 시작하여 뒤에 [ㄱ~ㅎ] 에 해당하는 범위에
    포함되는 글자1개가 오는 데이터가 조회됩니다.
    [ㄱ~ㅎ] 는 사실상 한글문자범위 전체기때문에
    한글문자 한개 라고 이해해도 되는 패턴입니다.
    EX) '감자채', '감자전', ...
*/

[^문자범위 또는 문자들] (지정된 문자범위 또는 문자들에 해당하지 않는 단일문자 1개)

위 패턴에 반대라고 생각하시면 됩니다.

패턴에 '[^]' 문자가 들어가면 와일드카드 문자로 인식되어, '해당괄호 내 문자범위 또는 문자들에 해당하지 않는 단일문자 1개'를 의미합니다.

예시를 통해 쉽게 이해해 보겠습니다.

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '감자[^채반자주]'
/*
    SEARCH_TEXT 칼럼에 '감자'로 시작하여 뒤에 '채','반','자','주' 가 
    아닌 한글자가 오는 데이터가 조회됩니다.
    EX) '감자전', ...
*/
SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '감자[^ㄱ~ㅎ]'
/*
    SEARCH_TEXT 칼럼에 '감자'로 시작하여 뒤에 [ㄱ~ㅎ] 에 해당하는 범위에 
    포함되지 않는 한글자가 오는 데이터가 조회됩니다.
    [ㄱ~ㅎ] 는 사실상 한글문자범위 전체기때문에 
    한글문자가 아닌 문자한개 라고 이해해도 되는 패턴입니다.
    EX) '감자A', '감자B', ...
*/

 

예제

여러 와일드카드를 같이 사용한 예제

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '감자[채전]%'
/*
    SEARCH_TEXT칼럼에 '감자'로 시작하고 다음글자로 '채' 또는 '전' 글자가 오며,
    그 뒤에 0글자 또는 그이상의 글자가 있는 데이터가 조회됩니다.
    EX) '감자채', '감자전', '감자채를 먹었다', '감자전을 부쳤다', ...
*/
SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '__전[^ㄱ-ㅎ]%' -- 언더바두개
/*
    SEARCH_TEXT 칼럼에 아무글자 2글자이후 세번째글자에 '전'이들어가고
    네번째글자에 [ㄱ-ㅎ] 범위에 포함되지 않는, 즉 한국어가 아닌 글자,
    그리고 이후에 글자가 없거나 아무글자가 있는 데이터가 조회됩니다.
    EX) '감자전A', '감자전B', '한일전VS남북전', '호박전IS 맛있다', ...
*/

 

와일드카드 문자를 와일드카드가 아닌 일반 리터럴 문자로 사용하는 법

'%'라는 문자를 포함하는 데이터를 조회하고 싶은데, '%'문자는 와일드카드 문자로 인식되어 '0개 이상의 문자를 가진 문자열'을 의미하게 됩니다.

그럼 우리는 LIKE문 패턴에서 '%' 문자가 포함된 문자를 검색할 수 없는 것일까요?

와일드카드 문자를 일반 리터럴 문자로 사용하는 법을 알아보겠습니다.

대괄호 와일드카드 문자 사용하기

'[]' 대괄호 와일드카드는 괄호 내 문자범위 또는 문자들에 해당하는지 여부를 검사합니다.

그렇다면 괄호 내에 와일드카드 문자를 넣으면 어떻게 될까요??

대괄호 내에서 와일드카드문자는 리터럴문자로 인식됩니다.

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '5%'
/*
    SEARCH_TEXT 칼럼의 값이 5로 시작하는 모든 데이터가 조회됩니다.
    EX) '5%', '50%', '51%', '52%', ...
*/

SELECT * FROM 테이블 WHERE SEARCH_TEXT LIKE '5[%]'
/*
    SEARCH_TEXT 칼럼의 값이 '5%'인 데이터가 조회됩니다.
    EX) '5%'
*/

ESCAPE절

패턴 이후 ESCAPE절을 사용하면 패턴에 포함된 와일드카드문자를 리터럴문자로 인식할 수 있습니다.

(이스케이프문자 뒤에 오는 와일드카드문자는 일반 리터럴 문자로 인식됩니다.)

SELECT * FROM 테이블 WHERE RATE LIKE '5%'
/*
    RATE 칼럼의 값이 5로 시작하는 모든 데이터가 조회됩니다.
    EX) '5%', '50%', '51%', '52%', ...
*/

SELECT * FROM 테이블 WHERE RATE LIKE '5\%' ESCAPE '\'
/*
    ESCAPE 문자뒤에오는 와일드카드 문자는 일반 리터럴문자로 인식됩니다.
    RATE 칼럼의 값이 '5%'인 데이터가 조회됩니다.
    EX) '5%'
*/