パターンマッチングで比較(LIKE句)
条件式を記述する時に LIKE 句を使用すると、カラムの値と文字列とが一致するかどうかを比較するときに % と _ の2つの特殊文字を使ったパターンマッチングを行うことができます。ここでは SQLite で LIKE 句を使った条件式の記述方法について解説します。
同じような目的で使用される GLOB 句については「パターンマッチングで比較(GLOB句)」を参照されてください。また条件式を記述するときに使用する WHERE 句については「取得するデータの条件を設定(WHERE句)」を参照されてください。
(Last modified: )
LIKE句を使った条件式の記述
LIKE 句を使用することでパターンマッチングを使って値の比較を行うことができます。書式は次の通りです。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム LIKE パターン;
パターンは特殊な文字であるパーセント(%)とアンダーバー(_)を文字列と組み合わせた値として記述します。
% と _ の意味は次の通りです。
% 任意の0文字以上の文字列 _ 任意の1文字
% は 0 文字以上の任意の文字列にマッチします。例えばパターンとして a%b が記述されていた場合、 a で始まり 0 個以上の任意の文字が間に入り最後に b で終わるような次の文字列にマッチします。
ab
axb
aonb
aoneb
atreeb
別のパターンとして T% が記述されていた場合、 T で始まる次の文字列にマッチします。
Tama
Tokyo
Toyama
Tegami
_ は任意の 1 文字にマッチします。例えばパターンとして a_b が記述されていた場合、 a で始まり 1 つの任意の文字が間に入り最後に b で終わるような次の文字列にマッチします。
axb
aob
agb
※ なお LIKE 句では大文字と小文字を区別しないようです。
----
それでは実際に試してみます。次のようなテーブルを作成しました。
create table user(id integer, name text, address text);
INSERT 文を使ってテーブルにデータをいくつか格納しておきます。
insert into user values(1, 'Suzuki', 'Osaka');
insert into user values(2, 'Yamada', 'Tokyo');
insert into user values(3, 'Kudou', 'Chiba');
insert into user values(4, 'Ushijima', 'Nagoya');
insert into user values(5, 'Hanada', 'Saitama');
insert into user values(6, 'Okamoto', 'Sapporo');
insert into user values(7, 'Shima', 'Tokyo');
取得するデータの条件を指定しないでデータを取得した場合は次のようになります。
select * from user;
それでは LIKE 句を使ってパターンマッチングを行ってみます。次の例では address カラムの値が S で始まる任意の文字列と一致するデータを取得します。
select * from user where address like 'S%';
今度は address カラムの値が o という文字が2回出てくる文字列と一致するデータを取得します。
select * from user where address like '%o%o%';
今度は name カラムの値が5文字のデータを取得します。(条件式で _ を5個記述しています)
select * from user where name like '_____';
NOT 演算子と組み合わせて name カラムの値が5文字ではないデータを取得することもできます。
select * from user where name not like '_____';
慣れないと意図した通りのパターンマッチングを記述するのは難しいですが、便利な機能ですので是非覚えておいてください。
特殊文字のエスケープ方法
LIKE句の中で % と _ は特別な意味を持ちますが、特殊な文字ではなく文字の一つとしてこの2つの文字を使用したい場合にはエスケープ処理をする必要があります。エスケープに使用する文字は任意の文字を指定することができ、例えば $ という文字をエスケープを表す文字として指定した場合、 $% と記述すれば文字としての % と認識されます。
エスケープとして使用する文字を指定する書式は次の通りです。
SELECT カラム名 , ... FROM テーブル名
WHERE カラム LIKE パターン ESCAPE エスケープ文字;
例えば次のように記述します。
select * from mytable where mycolumn like '%10$%' escape '$';
この場合、パターンの中の最初の % は「任意の 0 文字以上の文字列」ですが次の % は直前にエスケープを表す $ が記述されているので % という文字になります。よってこのパターンは「文字列の先頭から0個以上の任意の文字が続いた後に最後に 10% が記述されている」文字列となります。
実際に試してみます。次のようなテーブルを作成しました。
create table foods(id integer, name text);
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');
それでは LIKE 句を使ってパターンマッチングを行ってみます。 name カラムの値に _ が含まれているデータを取得します。エスケープを行わずに次のように記述してしまうと「 1 文字以上の文字が含まれる文字列」というパターンになってしまうので期待した結果にはなりません。
select * from foods where name like '%_%';
エスケープを行い次のようなパターンを記述すれば期待した結果が取得できます。
select * from foods where name like '%\_%' escape '\';
-- --
LIKE 句を使ってパターンマッチングを使った文字列の比較を行う条件式を記述する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。