パターンマッチングで比較
カラムに含まれる値を文字列と比較する場合に、ワイルドカードを使ったパターンマッチングを行うことができます。次の書式を使います。
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文字の値の場合にデータを取得します。
エスケープの指定
特殊な文字としてではなく文字として'%'と'_'を使用したい場合にはエスケープ処理をする必要があります。例えば'%'を文字としての'%'として記述する場合には、エスケープ文字+'%'と記述します。このエスケープ文字は任意の文字を使用することができ次のように指定します。
SELECT カラム名 , ... FROM テーブル名 WHERE カラム LIKE パターン ESCAPE エスケープ文字;
具体的には次のようになります。
create table data(id integer, data text); select * from customer where data like '10$%%' escape '$';
上記ではエスケープ文字として'$'を指定しています。その為、パターンの中に記述されている'$%'は文字としての'%'を意味しています。よって上記のSELECT文では「data」カラムの値が'10%'で始まる任意の長さの値の場合にデータを取得します。
サンプル
では実際に試してみます。
次のようなデータが格納されたテーブルを対象にします。
それでは「hobbies」カラムの値の中に'Sports'が含まれるデータだけを取得してみます。
select * from friends where hobbies like '%Sports%';
次に「name」カラムの値が5文字のデータだけを取得してみます。
select * from friends where name like '_____';
このようにLIKE句を使うことでワイルドカードを使ったパターンマッチングによる取得するデータの制限を行うことができます。
なおSQLiteのLIKE句では大文字と小文字を区別せずにパターンマッチを行います。例として「hobbies」カラムの値の中に'sports'が含まれるデータだけを取得してみます。
select * from friends where hobbies like '%sports%';
このように「sports」が含まれるデータを取得しようとしましたが「Sports」も一致すると判定されています。