[SQL] 문자열 패턴 매칭 검색 (LIKE)
SQL을 통해 SELECT에 WHERE 절을 사용하면 특정 열에 특정 값을 가지고 있는 행들을 출력할 수 있다. 예를들어 아래와 같이 'code'라는 문자열을 가진 행을 찾고 싶다면 아래와 같이 쿼리를 작성할 수 있다.
SELECT * FROM test WHERE doctype='code';
test 라는 테이블에서 doctype 열의 값이 code인 행들을 출력하는 예제이다. 그런데 만약 'code'를 포함하는 행들을 출력하고 싶을떄는 어떻게 해야할까? 이를 위해 SQL에서는 문자열 패턴 매칭 술어인 LIKE 기능을 제공한다.
doctype |
code is beautiful |
my code is good |
so nice |
LIKE
WHERE 컬럼명 LIKE 패턴
위 처럼 특정 컬럼에 패턴에 매칭되는 모든 행들을 출력할 수 있다. 그렇다면 패턴은 어떻게 정의할 수 있을까? 패턴은 아래의 메타 문자를 통해서 정의할 수 있다.
% : 임의의 문자열
_ : 임의의 문자 하나
그럼 위의 doctype 컬럼에서 code를 포함하는 모든 행을 출력하고 싶다면 어떻게 해야할까?
SELECT * FROM test WHERE doctype LIKE '%code%';
doctype |
code is beautiful |
my code is good |
위 쿼리를 수행하면 위 처럼 code 문자열이 포함된 모든 행을 출력한다.
%를 앞 뒤로 붙혀주었는데, 만약 앞에 % 메타 문자가 없으면 즉 'code%'로 쓰면 code로 시작하는 문자열이 출력될 것이다. 반대로 '%code'로 쓰면 code로 끝나는 문자열을 출력할 것이다.
그렇다면 _(언더스코어)는 어떨떄 사용할까? 해당 메타 문자는 문자 하나를 의미한다.
SELECT * FROM test WHERE doctype LIKE '_code';
라는 쿼리는 code 앞에 아무 문자 하나가 있다면 매칭이 된다. 예를들면 Acode, Bcode, 1code 등등 과 같이 앞에 아무런 하나의 문자가 있으면 된다. '__code'처럼 두개의 언더스코어가 있으면 ABcode, BCcode 등 앞에 두개 아무런 문자나 오고 code 문자열이 올떄 매칭이 된다.
LIKE에서의 이스케이스(Escape)
doc |
Average percentage is 50% |
Variable name is doc_type |
만약 LIKE를 통해 %나 _를 검색하고 싶다면 어떻게 해야할까? 만약 아래와 같은 데이터에서 %나 _를 가진 문자열을 검색하고 싶다면 이스케이프를 사용해야 한다.
만약 %가 들어간 문자를 사용하고 싶다면 아래처럼 이스케이프 문자 (\)를 써서 %를 검색할 수 있다.
SELECT * FROM test WHERE doc LIKE '%\%%';
마찬가지로 언더스코어도 같은 방식으로 찾을 수 있다.
SELECT * FROM test WHERE doc LIKE '%\_%';