パターンマッチングで比較(LIKE句)
条件式の中でカラムの値を文字列と一致するかどうか比較する場合、'%'と'_'の2つの特殊文字を使ったパターンマッチングを行うことができます。ここではLIKE句を使ったパターンマッチングを行う方法について解説します。(同じような目的で使用されるGLOB句も用意されています。GLOB句については「パターンマッチングで比較(GLOB句)」を参照して下さい)。
パターンマッチングを行う場合の書式は次の通りです。
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
それでは実際に試してみます。次のようなテーブルを作成しました。
create table user(id integer, name text, address text);
いくつかのデータが格納されています。取得するデータの条件を指定しないでデータを取得した場合は次のようになります。
select * from user;
それではLIKE句を使ってパターンマッチングを行ってみます。次の例では「address」カラムの値が「'T%'」とマッチするデータを取得しています。('T'で始まる文字列とマッチします)。
select * from user where address like 'T%';
次の例では「address」カラムの値が「'%o%o%'」とマッチするデータを取得しています。(文字列の中に'o'が2回以上出てくる文字列とマッチします)。
select * from user where address like '%o%o%';
次の例では「address」カラムの値が「'______'」とマッチするデータを取得しています。(文字列の中に文字が6文字出てくる文字列とマッチします)。
select * from user where address like '______';
このようにLIKE句を利用することで任意のパターンを定義してそのパターンに一致するデータを取得することができます。
LIKE句の中で'%'と'_'は特別な意味を持ちますが、特殊な文字ではなく文字の一つとしてこの2つの文字を使用したい場合にはエスケープ処理をする必要があります。エスケープに使用する文字は任意の文字を指定することができ、例えば'$'という文字をエスケープを表す文字として指定した場合、'$%'と記述すれば文字としての'%'と認識されます。
エスケープとして使用する文字を指定する書式は次の通りです。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム LIKE パターン ESCAPE エスケープ文字;
例えば次のように記述します。
select * from mytable where mycolumn like '%10$%' escape '$';
この場合、パターンの中の最初の'%'は「任意の0文字以上の文字列」ですが次の'%'は直前にエスケープを表す'$'が記述されているので「%」という文字になります。よってこのパターンは「文字列の先頭から0個以上の任意の文字が続いた後に最後に'10%'が記述されている」文字列となります。
実際に試してみます。次のようなテーブルを作成しました。
create table productname(id integer, name text);
テーブルには次のようなデータが格納されています。
「name」カラムの値に「'_'」が含まれているデータを取得します。エスケープを行わずに次のように記述してしまうと「1文字以上の文字が含まれる文字列」というパターンになってしまうので期待した結果にはなりません。
select * from productname where name like '%_%';
エスケープを行い次のようなパターンを記述すれば期待した結果が取得できます。(下記ではエスケープの文字として'@'を指定しています)。
select * from productname where name like '%@_%' escape '@';
パターンを正しく記述するのは場合によっては難しいのですが、LIKE句は便利な機能ですので是非利用されてみて下さい。
( Written by Tatsuo Ikura )