oracle

Oracle LIKEで’_’アンダーバーを使う場合はエスケープが必要

ワイルドカード文字

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');
スポンサーリンク
コピペで使う