【SQL】 文字列検索 (ワイルドカードの使い方)
ワイルドカードと一緒に使うLIKEキーワード
ここまでの演算子の説明で、条件式の書き方は理解されたと思います。比較演算子などで検索を行うには、比較の対象と同じものを指定する必要がありました。しかし、実際に検索を行うときは、必ずしも正しく値を記憶している訳ではありません。また、文字列の一部が一致するというあいまいな検索を行いたい場合もあります。このようなときに使うのがLIKEキーワードです。
LIKEキーワードはワイルドカードと呼ばれる文字列のパターンを表現するための記号とともに使います。LIKEキーワードの書式は次のように使います。
<列名> LIKE <検索条件>
<検索条件>は、これから解説するワイルドカードを使って記述します。LIKEを含む全体で条件式となります。
ワイルドカードには次のようなものがあります。
ワイルドカード | 内容 |
---|---|
% | 複数の文字にマッチする |
_ | 1つの文字にマッチする |
ただし、MSAccessの場合には、任意の複数の文字を返す「%」ワイルドカードが「*」になり、1文字を表す「_」ワイルドカードが「?」になりますので注意して下さい。
% ワイルドカード
「%」ワイルドカードは複数の文字にマッチするワイルドカードです。
SELECT * FROM 商品一覧 WHERE 商品名 LIKE 'うさぎ%';
商品コード | 商品名 | カテゴリ | 単価 | 仕入先 |
---|---|---|---|---|
EDU-0012 | うさぎ算 | 知能玩具 | 1800 | 実験堂 |
商品一覧
商品コード | 商品名 | カテゴリ | 単価 | 仕入先 |
---|---|---|---|---|
USA-0012 | 眠いうさぎ | ぬいぐるみ | 9800 | ウサギ社 |
USA-1011 | だれうさぎ | きぐるみ | 5000 | ウサギ社 |
EDU-0012 | うさぎ算 | 知能玩具 | 1800 | 実験堂 |
GAM-0004 | 子うさぎクエスト | ゲーム | 6800 | USAGI.Corp |
OOK-1001 | 舌の出た狼 | きぐるみ | 5200 | がるる社 |
SELECT * FROM 商品一覧 WHERE 商品名 LIKE '%うさぎ%';
商品コード | 商品名 | カテゴリ | 単価 | 仕入先 |
USA-0012 | 眠いうさぎ | ぬいぐるみ | 9800 | ウサギ社 |
USA-1011 | だれうさぎ | きぐるみ | 5000 | ウサギ社 |
EDU-0012 | うさぎ算 | 知能玩具 | 1800 | 実験堂 |
GAM-0004 | 子うさぎクエスト | ゲーム | 6800 | USAGI.Corp |
ここまで見てくるとわかるように、%ワイルドカードには次のような記述の仕方があります。
- 列名 LIKE ’文字列%’ : 先頭が「文字列」で始まる値
- 列名 LIKE ’%文字列’ : 最後が「文字列」で終わる値
- 列名 LIKE ’%文字列%’ : 「文字列」が含まれる値
ところで、「うさぎ」という文字列が先頭や最後ではなく、文字列の中にある行だけを検索したい場合にはどのようにすればよいでしょうか?残念ながら直接選択する演算子はありませんが、NOT演算子と組み合せて検索条件を記述することにより検索することができます。記述としては次のようになります。
SELECT * FROM 商品一覧
WHERE 商品名 LIKE '%うさぎ%'
AND 商品名 NOT LIKE 'うさぎ%'
AND 商品名 NOT LIKE '%うさぎ';
商品コード | 商品名 | カテゴリ | 単価 | 仕入先 |
GAM-0004 | 子うさぎクエスト | ゲーム | 6800 | USAGI.Corp |
「 _ 」 ワイルドカード
- A0 :マッチする
- AA :マッチする
- B0 :マッチしない
- A11 :マッチしない(Aの後ろが1文字でないため)
- AA1 :マッチしない(Aの前に文字があるため)
このように「 _ 」ワイルドカードは非常に厳密に検索を行うことができます。実際に使ってみましょう。
SELECT * FROM 商品一覧 WHERE カテゴリ LIKE '_ぐるみ';
商品コード | 商品名 | カテゴリ | 単価 | 仕入先 |
USA-1011 | だれうさぎ | きぐるみ | 5000 | ウサギ社 |
OOK-1001 | 舌の出た狼 | きぐるみ | 5200 | がるる社 |
このSQL文ではカテゴリが「_ぐるみ」にマッチする行を表示しています。ここで「ぬいぐるみ」が出てこないのは「ぐるみ」の前が2文字になっているためです。
商品一覧
商品コード | 商品名 | カテゴリ | 単価 | 仕入先 |
USA-0012 | 眠いうさぎ | ぬいぐるみ | 9800 | ウサギ社 |
USA-1011 | だれうさぎ | きぐるみ | 5000 | ウサギ社 |
EDU-0012 | うさぎ算 | 知能玩具 | 1800 | 実験堂 |
GAM-0004 | 子うさぎクエスト | ゲーム | 6800 | USAGI.Corp |
OOK-1001 | 舌の出た狼 | きぐるみ | 5200 | がるる社 |
また、マッチさせる文字数を2つ以上にしたい場合には、文字数分だけ「 _ 」を並べます。
SELECT * FROM 商品一覧 WHERE 商品コード LIKE '___-0012';
商品コード | 商品名 | カテゴリ | 単価 | 仕入先 |
USA-0012 | 眠いうさぎ | ぬいぐるみ | 9800 | ウサギ社 |
EDU-0012 | うさぎ算 | 知能玩具 | 1800 | 実験堂 |
ワイルドカードの組合せ
ワイルドカードは組合せて使うこともできます。「 % 」「 _ 」を組合せることにより。非常に多彩な文字列の検索ができます。
SELECT * FROM 商品一覧 WHERE 商品コード LIKE 'U%-_012';
商品コード | 商品名 | カテゴリ | 単価 | 仕入先 |
USA-0012 | 眠いうさぎ | ぬいぐるみ | 9800 | ウサギ社 |
これは、「商品コード」列で「U」から始まる複数の文字があり、最後の「012」の頭に1文字が入る値を検索しています。このようにワイルドカードを使うと、文字列の中で特定パターンを持ったものを検索することができます。