SQL like 前方一致、あいまい検索、エスケープ

目次

Likeの使い方

select * from テーブル名
where 列名 like 検索したいパターン

前方一致やあいまい検索を行うときは、where句にlikeと検索したいパターンを指定します。

検索したいパターンは、パーセント(%)またはアンダスコア(_)のワイルドカードを使用します。

ワイルドカード

% パーセント 0文字以上の任意の文字列を表す
_ アンダスコア 任意の1文字を表す

 

前方一致で検索する

前方一致検索は、likeと文字列の後にワイルドカードを指定します。

select * from テーブル名
where 列名 like '文字列%'

 

1.列名「romaji」で「tana」で始まる行を抽出します。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

 

2.SQLを実行します。

select * from employee
where romaji like 'tana%'

 

3.結果は、以下のとおりです。

id name romaji
2 田中 tanaka

 

あいまい検索/部分検索で検索する

あいまい検索は、likeと文字列の前後にワイルドカードを指定します。

select * from テーブル名
where 列名 like '%文字列%'

 

1.列名「romaji」で「a」がある行を抽出します。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

 

2.SQLを実行します。

select * from employee
where romaji like '%a%'

 

3.結果は、以下のとおりです。

id name romaji
2 田中 tanaka
3 佐藤 sato

 

後方一致で検索する

後方一致検索は、likeと文字列の前にワイルドカードを指定します。

select * from テーブル名
where 列名 like '%文字列'

 

1.列名「romaji」で「ki」で終わる行を抽出します。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

 

2.SQLを実行します。

select * from employee
where romaji like '%ki'

 

3.結果は、以下のとおりです。

id name romaji
1 鈴木 suzuki

 

like + 否定

likeの否定は、likeの前にnotを指定します。

select * from テーブル名
where 列名  not like '(%)文字列(%)'

 

1.列名「romaji」で「a」が含まれない行を抽出します。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

 

2.SQLを実行します。

select * from employee
where romaji not like '%a%'

 

3.結果は、以下のとおりです。

id name romaji
1 鈴木 suzuki

 

任意の1文字を指定する(アンダスコア(_))

アンダスコア(_)は、任意の1文字を表します。

select * from テーブル名
where 列名  like '(_)文字列(_)'

 

1.列名「romaji」に0文字以上の任意の文字のあとに「t」があり、その後に任意の一文字だけある行を抽出します。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

 

2.SQLを実行します。

select * from employee
where romaji like '%t_'

 

3.結果は、以下のとおりです。

id name romaji
3 佐藤 sato

1行目のtanakaは抽出されません。

 

エスケープする(検索したい文字列に%や_があるとき)

エスケープは、検索したい文字列に%やアンダスコア(_)があるときに使用します。

select * from テーブル名
where 列名  like '(エスケープ文字%)文字列(エスケープ文字%)' escape 'エスケープ文字'

 

1.列名「romaji」で「%」で始まる行を抽出します。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 %sato

 

2.SQLを実行します。

select * from employee
where romaji like '\%%' ESCAPE '\';

2行目は、escapeの文字として\を指定しています。
エスケープ文字は\がよく使われますが、その他の文字でも指定可能です。

\%%となっているので、1つめの%はエスケープされ%という文字で検索されます。
2つめの%はワイルドカードとして動作します。

 

3.結果は、以下のとおりです。

id name romaji
3 佐藤 %sato

 

likeで日時型を指定する場合(oracle)

1.OracleのTIMESTAMP型などの日時型をlikeで指定する場合、そのまま指定しても値を取得できません。

select * from employee1
where created_at like '2020/05%' --値を取得できない

 

2.以下のようにTO_CHARで一旦文字列にしてからlikeを使用します。

select * from employee1
where TO_CHAR(created_at, 'YYYY/MM') like '2020/05%'

または、betweenで範囲を指定します。
SQL between 範囲を指定して検索する

関連の記事

SQL in句 複数の値を条件にする

△上に戻る