SQL文のワイルドカード使用テクニック(ESCAPE定義エスケープ文字)


今日ボスは授業中に問題にぶつかった.
彼は手動でライブラリをバックアップする方法を示したとき、システムから'_を選択したいと思っていました.HIS'の末尾の表
SQL文を次のように入力します.
select * from obj where object_type='TABLE' and object_name like '%_HIS';

このSQL文について説明する必要があります.objはそのユーザーの下にあるすべてのオブジェクト(すでにあるユーザーとしてログインしています)、object_です.type='TABLE'は、すべてのオブジェクトタイプがテーブルであることをフィルタリングするフィルタタイプを設定し、object_nameはオブジェクト名に基づいてフィルタリングされます
結果として下線''がないテーブルがあります.しかしHISで終わるのも、結果出力で
最後には'HIS'の末尾の表は一つ一つnot in()に書いてフィルタリングする
データベースはORAを使用しています
LIKEキーワードには4種類のワイルドカードがあります.「%」は、「0文字以上の任意の文字列」を表します.“_”「任意の単一文字」を表します.「[]」は、「指定された範囲(例えば[a-f])またはセット(例えば[abcdef])内の任意の単一文字」を表す.「[^]」は、「指定された範囲(例えば[^a-f])またはセット(例えば[^abcdef])内の任意の単一文字」を表します.
以上から分かるように、実は'%HIS'と'%HIS'は等価です
その時、Oracleのescapeキーワードを思い出しませんでした.このキーワードはエスケープ文字を定義することができます.escapeが定義したエスケープ文字の後の最初の文字はエスケープしたい内容です.
たとえば、'/'をエスケープ文字として定義し、ワイルドカード''を標準文字にする
select * from obj where object_type='TABLE' and object_name like '%/_HIS' escape '/';

これでいいです.
【備考】:
mysqlでは''はエスケープ文字なのでmysqlで直接書くことができます
select * from obj where object_type='TABLE' and object_name like '%\_HIS';

----------------------------20090813-------------------------------
ORAのいくつかの関数を使用しても効果が得られます.
select object_name from obj where object_type='TABLE' and  instr(UPPER(object_name),'_HIS')>0;

----------------------------20090922-------------------------------
もう一つのinstrの関数は効果を達成することができます

select object_name from obj where object_type='TABLE' and instr(UPPER(object_name),'_HIS')<>0;