SQL LIKE 조건절에서 와일드카드 이스케이프 처리 기법

1. ESCAPE关键字的使用

SQL의 LIKE 연산자에서 와일드카드 문자를 실제 문자本身として検索する必要がある 경우, ESCAPE 키워드를 사용하여 이스케이프 문자를 정의할 수 있다. 이스케이프 문자는 와일드카드 바로 앞에 배치하며, 이렇게 하면 해당 와일드카드는 일반 문자로 인식된다.

예를 들어, 문자열 내에 5%를 포함하는 데이터를 검색하려면 다음과 같이 작성한다:

SELECT *
FROM products
WHERE product_code LIKE '%5/%%' ESCAPE '/'

위 쿼리에서 두 번째 %는 이스케이프 문자 / 뒤에 위치하므로 일반 문자로 처리되어 실제로 5% 문자열을 검색하게 된다.

2. 이스케이프 문자의 기본 개념

ESCAPE 'escape_character' 구문을 사용하면 문자열 내에서 와일드카드를 특수 문자가 아닌 리터럴 문자로 검색할 수 있다. 이스케이프 문자는 와일드카드 문자 앞에 배치하여 해당 문자의 특수 기능을 비활성화한다.

SELECT *
FROM members
WHERE nickname LIKE 'hero_!' ESCAPE '!'

위 예제의 경우: 리터럴 문자 "hero_"를 찾으려고 할 때, LIKE 'hero_'heroa, herob 등의 다양한 문자열과 매칭된다. 그러나 ESCAPE '!'를 사용하면 ! 뒤에 오는 _를 일반 문자로 인식하여 정확히 "hero_" 문자열만 검색한다.

3. 실전 적용 예제

CREATE TABLE inventory (
    item_name VARCHAR(50)
)
GO

INSERT INTO inventory VALUES ('전자#25')
INSERT INTO inventory VALUES ('전자#37')
INSERT INTO inventory VALUES ('의류#42')
GO

SELECT * FROM inventory 
WHERE item_name LIKE '%/#37' ESCAPE '/'
GO

DROP TABLE inventory

실행 결과:

item_name
----------
전자#37
의류#42

이 예제에서는 /를 이스케이프 문자로 지정하여 # 기호를 일반 문자로 처리하고 있다.

4. 대괄호를 이용한 특수문자 매칭

SQL Server에서는 특정 와일드카드 문자(% , _ , [ , ])를 리터럴로 매칭하기 위해 대괄호 []를 사용할 수 있다.

기호의미
%0개 이상의任意문자
_1개의任意문자
[]지정된 범위 내의 문자 하나
[^]지정된 범위를 제외한 문자

특수문자 매칭 예제

패턴매칭 대상
LIKE '7\[%\]'7%
LIKE '\[\_\]m'_m
LIKE '\[a-cdf\]'a, b, c, d, f
LIKE '\[-acdf\]'-, a, c, d, f
LIKE '\[\[\]'[
LIKE '\]']
LIKE 'data\[\_\]f%'data_f, data_fa
LIKE 'data\[xyz\]'datax, datay, dataz
LIKE '\[^0-9\]'숫자 제외 모든 문자

구체적인 SQL 예제

-- 대괄호를 사용하여 리터럴 [ 검색
SELECT 1 WHERE '[DEFghij' LIKE '[[]%'

-- 대괄호를 사용하여 리터럴 ] 검색
SELECT 1 WHERE ']DEFghij' LIKE ']%'

-- 대괄호를 사용하여 리터럴 [] 검색
SELECT 1 WHERE '[]DEFghij' LIKE '[[]]%%'

-- 대괄호를 사용하여 리터럴 _ 검색
SELECT 1 WHERE '_DEFghij' LIKE '[_]%'

-- 대괄호를 사용하여 리터럴 % 검색
SELECT 1 WHERE 'ABC%DEF' LIKE 'ABC[%]DEF'

5. ESCAPE를 통한 전역 이스케이프 처리

캐럿(^), 하이픈(-), 닫는 대괄호(])와 같은 특수 문자의 경우, 它们本身が含まれているため 대괄호 방식만으로는 처리하기 어렵다. 이때 ESCAPE 절을 사용하면 모든 특수 문자를 일관되게 처리할 수 있다.

-- 다양한 이스케이프 문자 사용 예제
SELECT 1 WHERE '^XYZabc' LIKE '!^XYZabc' ESCAPE '!'
SELECT 1 WHERE '-XYZabc' LIKE '!-XYZabc' ESCAPE '!'
SELECT 1 WHERE ']XYZabc' LIKE '!]XYZabc' ESCAPE '!'

SELECT 1 WHERE '%XYZabc' LIKE '\%XYZabc' ESCAPE '\'
SELECT 1 WHERE '%XYZabc' LIKE '!%XYZabc' ESCAPE '!'
SELECT 1 WHERE '%XYZabc' LIKE '#%XYZabc' ESCAPE '#'
SELECT 1 WHERE '%XYZabc' LIKE '@%XYZabc' ESCAPE '@'

SELECT 1 WHERE '[XYZabc' LIKE '![XYZabc' ESCAPE '!'
SELECT 1 WHERE ']XYZabc' LIKE '!]XYZabc' ESCAPE '!'

위의 예제에서 확인できる 규칙은 이스케이프 문자 바로 다음에 오는 특수 문자가 일반 문자로 처리된다는 것이다. 이는 C 언어의 이스케이프 시퀀스와 유사한 원리이다.

6. 복합 패턴 매칭 사례

より複雑な매칭이 필요한 경우, 이스케이프 문자와 대괄호를 함께 사용할 수 있다:

SELECT 1 WHERE '[^A-Z]VWXYZ' LIKE '\[\^A\-Z\]%' ESCAPE '\'

이 쿼리는 대괄호 안에 포함된 리터럴 문자(^, A-Z)를 찾기 위해 이스케이프 문자를 활용하는 방법을 보여준다.

7월 10일 20:41에 게시됨