ワイルドカード文字
Oracleのワイルドカード文字には『%(複数文字)』と『_(単一文字)』の2つがあります。これらを検索するにはエスケープ文字を使う必要があります。ワイルドカード『%』はメジャーですが、『_(アンダーバー)』は意外と知らない人多いようですね。
-- 検証データ
SQL> select * from ex03 order by lno
2 ;
LNO ITEM_ID NAME
______ ___________ _____________
1 SU_38 六角ボルトステンレス
2 ME_38 六角ボルト鉄
3 PEL8100 ドライバ+
4 MEL8100 ドライバ-
5 ME_38%20 六角ボルト鉄20mm
-- 「6角ボルト鉄」を検索するべく'ME_'始まりのコードを検索したつもりが
-- 以下SQLでは意図した結果になりません。
SQL> select * from ex03 where item_id like 'ME_%' order by lno;
LNO ITEM_ID NAME
______ ___________ _____________
2 ME_38 六角ボルト鉄
4 MEL8100 ドライバ-
5 ME_38%20 六角ボルト鉄20mm
アンダーバー(_)を対象にワイルドカード検索するには
select * from ex03 where item_id like 'ME@_%' escape '@' order by lno ;
パーセント(%)を対象にワイルドカード検索するには
select * from ex03 where item_id like '%@%%' escape '@' order by lno ;
ワイルドカード文字を対象に検索した結果
以下例では「@」をエスケープ文字に使用していますが、検索に支障のでない範囲で別の文字にする事も可能です。
SQL> select * from ex03 where item_id like 'ME@_%' escape '@' order by lno
2 ;
LNO ITEM_ID NAME
______ ___________ _____________
2 ME_38 六角ボルト鉄
5 ME_38%20 六角ボルト鉄20mm
SQL> select * from ex03 where item_id like '%@%%' escape '@' order by lno
2 ;
LNO ITEM_ID NAME
______ ___________ _____________
5 ME_38%20 六角ボルト鉄20mm
SQL>
検証データは以下の通り
create table ex03 (lno number,item_id varchar2(20),name varchar2(30)) ; insert into EX03 (LNO, ITEM_ID, NAME) values(1, 'SU_38', '六角ボルトステンレス'); insert into EX03 (LNO, ITEM_ID, NAME) values(2, 'ME_38', '六角ボルト鉄'); insert into EX03 (LNO, ITEM_ID, NAME) values(3, 'PEL8100', 'ドライバ+'); insert into EX03 (LNO, ITEM_ID, NAME) values(4, 'MEL8100', 'ドライバ-'); insert into EX03 (LNO, ITEM_ID, NAME) values(5, 'ME_38%20', '六角ボルト鉄20mm');