文字列が部分一致する行を問い合わせるには、LIKE句を使用します。ワイルドカードを使用した比較には、等号 (=) ではなくLIKE句を使用します。
expr1 [NOT] LIKE expr2 [ESCAPE expr3]
比較元の文字列式を指定する。
比較先の文字列式を指定する。任意の文字を表すアンダースコア(_)や任意の文字列を表すパーセント記号(%)といったワイルドカードを使用することができる。
エスケープ文字として使用する文字を指定する。
ワイルドカードとは、任意の1文字あるいは任意の複数文字を表わす記号である。
| ワイルドカード | 説明 |
|---|---|
| _ | 任意の1文字 |
| % | 任意の複数文字(0文字以上) |
| * | 任意の複数文字(Microsoft Accessの場合) |
1文字の任意の文字は「_」で表す。
0文字以上の任意の文字列を表すワイルドカードはパーセント記号(%)で表します。
select * from 従業員表 where 部署名 like '%営業%'
上記のSQL文の場合、部署名に「営業」という文字列を含むものが該当します(例えば、「営業3課」や「企画営業課」など)。
パーセント(%)をワイルドカードとして使用するのではなく、ただの文字として扱いたい場合は、ESCAPE節に指定したエスケープ文字を前に付ける。
ESCAPEに指定する文字は何でもよいが、慣習的に「\」が使われることが多い。
たとえば、「FOO」の部分一致ではなく、「%FOO」の前方一致で検索したい場合には、次のようにする。
SELECT id FROM exsample WHERE id LIKE '\%FOO%' ESCAPE '\';
アンダースコア(_)をワイルドカードとして使用するのではなく、ただの文字として扱いたい場合は、ESCAPE節に指定したエスケープ文字を前に付ける。
たとえば、「FOO」の前方一致ではなく、「FOO_」の前方一致を検索したい場合には、次のようにする。
SELECT id FROM exsample WHERE id LIKE 'FOO\_%' ESCAPE '\';
指定した文字列パターンに一致するのではなく、一致しないものを検索したい場合には、否定演算子(NOT)をLIKEの前に付ける。
SELECT * FROM example WHERE id NOT LIKE 'TEST%'
SQLのLIKE演算子で正規表現が使えるかどうかは、リレーショナルデータベース管理システムによって異なる。
| DBMS | LIKEで正規表現が使えるか | 正規表現を使える演算子 |
|---|---|---|
| MySQL | No | REGEXP |
| Oracle | No | なし |
| PostgreSQL | No | SIMILAR TO |
| SQLSever | Yes | LIKE |
OracleデータベースではLIKE演算子に正規表現は使えない。また、LIKEの代わりに正規表現を使える演算子も存在しない。
Oracleで正規表現によるパターンマッチングを行うには、正規表現関数を使用する。
| 関数 | 説明 |
|---|---|
| REGEXP_LIKE | 正規表現と一致すればTRUE、一致しなければFALSEが戻される。 |
| REGEXP_COUNT | 正規表現と一致する出現回数が戻される。 |
| REGEXP_INSTR | 正規表現と一致する開始位置を示す整数が戻される。 |
| REGEXP_REPLACE | 正規表現と一致する部分を置換文字列で置き換えた文字列が戻される。 |
| REGEXP_SUBSTR | 正規表現と一致する部分文字列が戻される。 |
REGEXP_LIKE関数の使い方を示す。
SELECT * FROM emp WHERE REGEXP_LIKE(emp.first_name, '^Ste(v|ph)en$')
この例では、empテーブルのfirst_nameカラムがStevenまたはStephenのレコードを検索している。
複数条件のうちいずれかを満たすものはOR使う。
SELECT * FROM dept WHERE dname LIKE '営業%' OR dname LIKE '業務%'
複数条件の場合、ANDを使う。