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

조건식을 작성할 때 GLOB 절을 사용하면 컬럼의 값과 문자열과 일치 여부를 비교할 경우에 별표(*)과 물음표(?) 2개의 특수 문자를 사용한 패턴 매칭을 할 수 있다. 여기에서는 GLOB 절을 사용한 조건부 표현식에 대한 작성 방법을 설명한다.

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

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

 

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

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

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

동일하게 패턴 매칭을 하는 LIKE 절과의 차이는 패턴을 작성할 때 사용하는 특수 문자이다. GLOG 절에서는 다음과 같은 특수 문자를 사용하여 패턴을 작성한다.

특수문자 설명
* 임의의 문자 0개 이상의 문자열
? 임의의 문자 1개
[abc] a or b or c 중 하나와 일치
[a-d] a에서 d까지 중 하나와 일치

별표(*)은 문자 0개 이상의 임의의 문자열과 일치한다. 예를 들어, 패턴으로 a*b라고 작성되면 a로 시작하여 0개 이상의 문자가 사이에 들어가고 마지막으로 b로 끝나는 같은 다음과 문자열과 일치한다.

ab
axb
aonb
aoneb
atreeb

물음표(?)은 임의이 1개의 문자와 일치한다. 예를 들어 패턴으로 a?b라고 작성되면 a로 시작하여 하나의 문자가 사이에 들어가고 마지막으로 b로 끝나는 같은 다음과 문자열과 일치한다.

axb
aob
agb

[abc]는 괄호 안의 문자 중 하나와 일치한다. 예를 들어 패턴으로 [mk]*라고 작성되면 m 또는 k로 시작하여 임의의 길이의 문자열과 일치한다.

mouse
kitchen
movie

또한 [^abc] 처럼 앞에 ^를 붙이면 괄호 안의 어느 문자와도 일치하지 않는 문자와 일치한다. 예를 들어 패턴으로 [^abcde]*가 작성되면 a b c d e 이외의 문자로 시작 임의의 길이의 문자열과 일치한다.

yellow
green
red

괄호는 - 를 사용하여 [a-d]와 같이 범위 지정도 할 수 있다. 이 경우 괄호 안의 첫 번째 문자에서 마지막 문자까지의 모든 문자와 일치한다. 예를 들어 패턴으로 [a-zA-Z0-9]*라고 작성되면, a에서 z 또는 A에서 Z 또는 0에서 9까지의 문자로 시작하는 임의의 길이의 문자열과 일치한다.

Hello
100point
good

주의
LIKE 절과 달리 GLOB 절에서는 대소 문자를 구별한다.

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

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

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

insert into user values (1, 'Blogger');
insert into user values (2, 'rondobell');
insert into user values (3, 'blue*star');
insert into user values (4, '2525');
insert into user values (5, 'Star');
sqlite> insert into user values (1, 'Blogger');
sqlite> insert into user values (2, 'rondobell');
sqlite> insert into user values (3, 'blue*star');
sqlite> insert into user values (4, '2525');
sqlite> insert into user values (5, 'Star');
sqlite> 

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

select * from user;
sqlite> select * from user;
id          screenname
----------  ----------
1           Blogger   
2           rondobell 
3           blue*star 
4           2525      
5           Star      
sqlite> 

그러면 GLOB 절을 사용하여 패턴 매칭을 해보자. 다음 예제에서는 screenname 컬럼의 값이 b부터 시작하는 임의의 문자열과 일치하는 데이터를 조회하고 있다.

select * from user where screenname glob 'b*';
sqlite> select * from user where screenname glob 'b*';
id          screenname
----------  ----------
3           blue*star 
sqlite> 

GLOB 절의 경우 대소문자를 구분하므로 b 또는 B로 시작하는 문자열과 일치하려는 경우에는 다음과 같이 패턴을 작성한다.

select * from user where screenname glob '[bB]*';
sqlite> select * from user where screenname glob '[bB]*';
id          screenname
----------  ----------
1           Blogger   
3           blue*star 
sqlite> 

다음 예제에서는 screenname 컬럼의 값이 영문자(a - z 또는 A-Z)로 시작 임의의 문자열과 일치하는 데이터를 조회하고 있다.

select * from user where screenname glob '[a-zA-Z]*';
sqlite> select * from user where screenname glob '[a-zA-Z]*';
id          screenname
----------  ----------
1           Blogger   
2           rondobell 
3           blue*star 
5           Star      
sqlite> 

이렇게 GLOB 절을 이용하면 임의의 패턴을 정의하고 그 패턴과 일치하는 데이터를 조회할 수 있다.

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

GLOB 절에서 별표(*), 물음표(?), 왼쪽 대괄호([), 오른쪽 대괄호(])의 4개의 문자는 특별한 의미를 갖지만, 특수 문자가 아닌 문자의 하나로서 이 4개의 문자를 사용하려는 경우에는 이스케이프 처리를 해야 한다. GLOB 절에서는 특수 문자를 이스케이프 처리를 하고 싶은 경우는 []로 둘러싸야 한다.

그러면 실제로 해보도록 하자. 앞에서 같은 테이블을 사용하겠다. 조회할 데이터의 조건을 지정하지 않고 데이터를 검색하면 다음과 같다.

select * from user;
sqlite> select * from user;
id          screenname
----------  ----------
1           Blogger   
2           rondobell 
3           blue*star 
4           2525      
5           Star      
sqlite> 

screenname 컬럼의 값에 별표(*)가 포함되어 있는 데이터를 조회한다. 이스케이프 처리를 하지 않고 다음과 같이 작성하면 단순히 임의의 문자열과 일치하는 패턴이 되어 원하는 결과가 조회되지 않는다.

select * from user where screenname glob '***';
sqlite> select * from user where screenname glob '***';
id          screenname
----------  ----------
1           Blogger   
2           rondobell 
3           blue*star 
4           2525      
5           Star      
sqlite> 

별표(*)를 문자로 조건식에서 사용하는 경우에 이스케이프 처리는 다음과 같이 작성한다.

select * from user where screenname glob '*[*]*';
sqlite> select * from user where screenname glob '*[*]*';
id          screenname
----------  ----------
3           blue*star 
sqlite> 

LIKE 절과는 달리 GLOB 절에서는 특수 문자를 이스케이프 처리하는 방법은 선택할 수 없다.