パターンマッチングで比較(GLOB句)

条件式を記述する時に GLOB 句を使用すると、カラムの値と文字列とが一致するかどうかを比較するときに * と ? の2つの特殊文字を使ったパターンマッチングを行うことができます。ここでは SQLite で GLOB 句を使った条件式の記述方法について解説します。

同じような目的で使用される LIKE 句については「パターンマッチングで比較(LIKE句)」を参照されてください。また条件式を記述するときに使用する WHERE 句については「取得するデータの条件を設定(WHERE句)」を参照されてください。

(Last modified: )

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 で始まり 1 つの任意の文字が間に入り最後に 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);

GLOB句を使った条件式の記述(1)

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');

GLOB句を使った条件式の記述(2)

取得するデータの条件を指定しないでデータを取得した場合は次のようになります。

select * from user;

GLOB句を使った条件式の記述(3)

それでは GLOB 句を使ってパターンマッチングを行ってみます。次の例では screenname カラムの値が b からはじまり任意の文字列とマッチするデータを取得しています。

select * from user where screenname glob 'b*';

GLOB句を使った条件式の記述(4)

GLOB 句の場合は大文字と小文字を区別しますので b または B で始まる文字列とマッチさせたい場合は次のようにパターンを記述します。

select * from user where screenname glob '[bB]*';

GLOB句を使った条件式の記述(5)

次の例では screenname カラムの値が 半角英文字( a から z 、または A から Z )で始まり任意の文字列とマッチするデータを取得しています。

select * from user where screenname glob '[a-zA-Z]*';

GLOB句を使った条件式の記述(6)

このように GLOB 句を利用することで任意のパターンを定義してそのパターンに一致するデータを取得することができます。

特殊文字のエスケープ方法

GLOB 句の中でアスタリスク(*)、クエスチョンマーク(?)、左括弧([)、右括弧(])の4つの文字は特別な意味を持ちますが、特殊な文字ではなく文字の一つとしてこの4つの文字を使用したい場合にはエスケープ処理をする必要があります。GLOB 句では特殊な文字をエスケープしたい場合には[]で囲います。

それでは実際に試してみます。先ほどと同じテーブルを使用し、取得するデータの条件を指定しないでデータを取得した場合は次のようになります。

select * from user;

特殊文字のエスケープ方法(1)

それでは実際に試してみます。 screenname カラムの値に * が含まれているデータを取得します。エスケープを行わずに次のように記述してしまうと単に任意の文字列と一致するパターンになってしまうので期待した結果にはなりません。

select * from user where screenname glob '***';

特殊文字のエスケープ方法(2)

* を文字として条件式の中で使用する場合は、エスケープを行い次のように記述します。

select * from user where screenname glob '*[*]*';

特殊文字のエスケープ方法(3)

なお LIKE 句とは異なり GLOB 句では特殊文字をエスケープする方法は選択できません。

-- --

GLOB 句を使ってパターンマッチングを使った文字列の比較を行う条件式を記述する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。