ETC

[SQL] 문자열 패턴 매칭 검색 (LIKE)

lim 2022. 1. 16. 19:33
반응형

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 '%\_%';

 

반응형