パターンマッチングで比較

カラムに含まれる値を文字列と比較する場合に、ワイルドカードを使ったパターンマッチングを行うことができます。次の書式を使います。

SELECT カラム名 , ... FROM テーブル名 WHERE カラム LIKE パターン;

パターンは文字列と特殊な文字'%'と'_'を組み合わせた文字列で指定します。'%'と'_'の意味は次の通りです。

演算子意味
%任意の0文字以上の文字列
_任意の1文字

'_'は任意の1文字にマッチします。

___     3文字の任意の文字列
a__b    aで始まりbで終わる4文字の文字列

'%'は0文字以上の任意の文字列にマッチします。

sql%    sqlで始まる任意の長さの文字列
a%b     aで始まりbで終わる任意の長さの文字列
a_%b    aで始まりbで終わる3文字以上の任意の長さの文字列
日本語などが含まれる文字列に対してパターンマッチングを行うと正常に動作しませんでした。理由は今のところ分かっていません。

具体的には次のようになります。

create table customer(id integer, name text, address text);

select * from customer where address like 'Tokyo%';
select * from customer where name like '____';

最初のSELECT文では「address」カラムの値が'Tokyo'から始まる任意の長さの値の場合にデータを取得します。2番目のSELECT文では「name」カラムの値が任意の4文字の値の場合にデータを取得します。

なおSQLiteのLIKE句では大文字と小文字が区別されません。

エスケープの指定

特殊な文字としてではなく文字として'%'と'_'を使用したい場合にはエスケープ処理をする必要があります。例えば'%'を文字としての'%'として記述する場合には、エスケープ文字+'%'と記述します。このエスケープ文字は任意の文字を使用することができ次のように指定します。

SELECT カラム名 , ... FROM テーブル名
 WHERE カラム LIKE パターン ESCAPE エスケープ文字;

具体的には次のようになります。

create table data(id integer, data text);

select * from customer where data like '10$%%' escape '$';

上記ではエスケープ文字として'$'を指定しています。その為、パターンの中に記述されている'$%'は文字としての'%'を意味しています。よって上記のSELECT文では「data」カラムの値が'10%'で始まる任意の長さの値の場合にデータを取得します。

サンプル

では実際に試してみます。

次のようなデータが格納されたテーブルを対象にします。

p6-1

それでは「hobbies」カラムの値の中に'Sports'が含まれるデータだけを取得してみます。

select * from friends where hobbies like '%Sports%';

p6-2

次に「name」カラムの値が5文字のデータだけを取得してみます。

select * from friends where name like '_____';

p6-3

このようにLIKE句を使うことでワイルドカードを使ったパターンマッチングによる取得するデータの制限を行うことができます。

なおSQLiteのLIKE句では大文字と小文字を区別せずにパターンマッチを行います。例として「hobbies」カラムの値の中に'sports'が含まれるデータだけを取得してみます。

select * from friends where hobbies like '%sports%';

p6-4

このように「sports」が含まれるデータを取得しようとしましたが「Sports」も一致すると判定されています。