SQLite | 데이터 조회 | 패턴 매칭 비교 (LIKE 절)

조건식을 작성할 때 LIKE 절을 사용하면 컬럼의 값과 문자열과 일치 여부를 비교할 때에 퍼센트(%)와 밑줄(_) 2개의 특수 문자를 사용한 패턴 매칭을 할 수 있다. 여기에서는 LIKE 절을 사용한 조건부 표현식에 대한 작성 방법을 설명한다.

유사한 목적으로 사용되는 GLOB 절에 대해서는 패턴 매칭 비교 (GLOB 절)를 참조한다.

조건식을 작성할 때 사용하는 WHERE 절에 대해서는 조회할 데이터의 조건 설정 (WHERE 절)를 참조한다.

LIKE 절을 사용한 조건부 표현식 작성

LIKE 절을 사용하여 패턴 매칭으로 값 비교를 할 수 있다. 형식은 다음과 같다.

SELECT 컬럼명, ... FROM 테이블명 WHERE 컬럼 LIKE 패턴;

패턴은 특수 문자인 퍼센트(%)와 밑줄(_)을 문자열로 조합한 값으로 작성한다.

퍼센트(%)와 밑줄(_)의 의미는 다음과 같다.

특수문자 설명
% 임의의 문자 0개 이상의 문자열
_ 임의의 문자 한개

퍼센트(%)는 문자 0개 이상의 임의의 문자열과 일치한다. 예를 들어 패턴으로 “a%b"가 작성되어 있다면 a로 시작하여 0개 이상의 문자를 사이에 들어가 마지막으로 b로 끝나는 다음과 같은 문자열과 일치한다.

ab
axb
aonb
aoneb
atreeb

다른 패턴으로 “T%“가 작성되었다면 T로 시작하는 다음과 같은 문자열과 일치한다.

Tiger
Toast
Tuck
Tackle

밑줄(_)은 임의의 문자 한개와 일치한다. 예를 들어 패턴으로 “a_b"가 작성되었다면 a로 시작하여 한개의 문자가 사이에 들어가 마지막으로 b로 끝나는 다음과 같은 문자열과 일치한다.

axb
aob
agb

주의
LIKE 절에서는 대문자와 소문자를 구별하지 않는다.

그러면 실제로 해보도록 하겠다. 다음과 같이 테이블을 만든다.

create table user (id integer, name text, address text);
sqlite> create table user (id integer, name text, address text);
sqlite> 

INSERT 문을 사용하여 테이블에 데이터를 추가한다.

insert into user values (1, 'devkuma', 'Seoul');
insert into user values (2, 'kimkc', 'Busan');
insert into user values (3, 'araikuma', 'Paju');
insert into user values (4, 'happykuma', 'Paju');
insert into user values (5, 'mykuma', 'Daejeon');
insert into user values (6, 'yourkuma', 'Seongnam');
insert into user values (7, 'raccoon', 'Suwon');
sqlite> insert into user values (1, 'devkuma', 'Seoul');
sqlite> insert into user values (2, 'kimkc', 'Busan');
sqlite> insert into user values (3, 'araikuma', 'Paju');
sqlite> insert into user values (4, 'happykuma', 'Paju');
sqlite> insert into user values (5, 'mykuma', 'Daejeon');
sqlite> insert into user values (6, 'yourkuma', 'Seongnam');
sqlite> insert into user values (7, 'raccoon', 'Suwon');
sqlite> 

조회할 데이터의 조건을 지정하지 않고 데이터를 검색하면 다음과 같다.

select * from user;
sqlite> select * from user;
id          name        address   
----------  ----------  ----------
1           devkuma     Seoul     
2           kimkc       Busan     
3           araikuma    Paju      
4           happykuma   Paju      
5           mykuma      Daejeon   
6           yourkuma    Seongnam  
7           raccoon     Suwon     
sqlite> 

그러면 LIKE 절을 사용하여 패턴 매칭을 해보자. 다음 예제에서는 address 컬럼의 값이 S로 시작하는 문자열과 일치하는 데이터를 조회한다.

select * from user where address like 'S%';
sqlite> select * from user where address like 'S%';
id          name        address   
----------  ----------  ----------
1           devkuma     Seoul     
6           yourkuma    Seongnam  
7           raccoon     Suwon     
sqlite> 

이번에는 address 컬럼의 값이 e 문자가 두번 나오는 문자열과 일치하는 데이터를 조회한다.

select * from user where address like '%e%e%';
sqlite> select * from user where address like '%e%e%';
id          name        address   
----------  ----------  ----------
5           mykuma      Daejeon   
sqlite> 

이번에는 name 컬럼의 값이 7개인 문자 데이터를 조회한다. (조건식에 밑줄(_) 7개 작성한다.)

select * from user where name like '_______';
sqlite> select * from user where name like '_______';
id          name        address   
----------  ----------  ----------
1           devkuma     Seoul     
7           raccoon     Suwon     
sqlite> 

NOT 연산자와 함께 name 컬럼의 값이 5개인 문자가 아닌 데이터를 검색 할 수 있다.

select * from user where name not like '_______';
sqlite> select * from user where name not like '_______';
id          name        address   
----------  ----------  ----------
2           kimkc       Busan     
3           araikuma    Paju      
4           happykuma   Paju      
5           mykuma      Daejeon   
6           yourkuma    Seongnam  
sqlite> 

익숙해지지 않으면 의도한대로 패턴을 작성하는 것이 어려울 수 있지만, 사용하면 편리한 기능이므로 꼭 기억하도록 하자.

특수 문자의 이스케이프(escape) 처리 방법

LIKE 절에서 퍼센트(%)와 밑줄(_)은 특별한 의미를 갖지만 특수 문자가 아닌 문자의 하나로서 이 두 문자를 사용하려는 경우에는 이스케이프 처리를 해야 한다. 이스케이프에 사용하는 문자는 임의의 문자로 지정할 수 있다. 예를 들어, 문자 달러($)를 이스케이프를 처리하는 문자로 지정하면, “$%“라고 작성하면 문자로서 %로 인식된다.

이스케이프로 사용할 문자를 지정하는 형식은 다음과 같다.

SELECT 컬럼명, ... FROM 테이블명 WHERE 컬럼 LIKE 패턴 ESCAPE 이스케이프 문자;

예를 들어, 다음과 같이 작성한다.

select * from mytable where mycolumn like '%10$%' escape '$';

이 경우에는 패턴 중에 첫번째 %는 “임의의 문자 0개 이상의 문자열"이지만, 두번째 %는 바로 앞에 이스케이트 처리를 하는 문자($)가 작성되어 있으므로 %라는 문자가 된다. 따라서 이 패턴은 “문자열 앞에 0개 이상의 임의의 문자가 있고 마지막에 10%로 끝나는” 문자열이다.

실제로 해보도록 하자. 다음과 같이 테이블을 만든다.

create table foods (id integer, name text);
sqlite> create table foods (id integer, name text);
sqlite> 

INSERT 문을 사용하여 테이블에 데이터를 추가한다.

insert into foods values (1, 'Water');
insert into foods values (2, 'Apple_Pie');
insert into foods values (3, 'Black_Coffee');
insert into foods values (4, 'Pizza');
insert into foods values (5, 'Sandwich');
insert into foods values (6, 'French_Bread');
sqlite> insert into foods values (1, 'Water');
sqlite> insert into foods values (2, 'Apple_Pie');
sqlite> insert into foods values (3, 'Black_Coffee');
sqlite> insert into foods values (4, 'Pizza');
sqlite> insert into foods values (5, 'Sandwich');
sqlite> insert into foods values (6 'French_Bread');
Error: near "'French_Bread'": syntax error
sqlite> insert into foods values (6, 'French_Bread');
sqlite> 

그러면 LIKE 절을 사용하여 패턴 매칭을 해보자. name 컬럼의 값에 밑줄(_)이 포함된 데이터를 조회한다. 이스케이프를 하지 않고 다음과 같이 작성하면 “1개 이상의 문자가 포함된 문자열"라는 패턴이 되어 버리기 때문에 원하는 결과가 조회되지 않는다.

select * from foods where name like '%_%';
sqlite> select * from foods where name like '%_%';
id          name      
----------  ----------
1           Water     
2           Apple_Pie 
3           Black_Coff
4           Pizza     
5           Sandwich  
6           French_Bre
sqlite> 

이스케이프 처리하여 다음과 같은 패턴을 작성하면 원하는 결과를 조회할 수 있다.

select * from foods where name like '%$_%'escape '$';
sqlite> select * from foods where name like '%$_%'escape '$';
id          name      
----------  ----------
2           Apple_Pie 
3           Black_Coff
6           French_Bre
sqlite>