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>