この時、'%'と'_'はそれぞれ任意の文字列、任意の1文字を表す特殊文字として扱われます。
したがって、'%'や'_'という文字を検索したい場合は、エスケープ文字を使用して、文字としての'%'、'_'であることを明示する必要があります。
例えば、COL1 に'_'を含む TBL1 のレコードを検索したい場合は以下のように記述します。
SELECT * FROM TBL1 WHERE COL1 LIKE '%\_%' ESCAPE '\'
と、ここまでは SQL の常識です。
しかし、実はこの'%'と'_'、全角の'%'、'_'でもやはり特殊文字として認識されてしまうのです。
つまり、
SELECT * FROM TBL1 WHERE COL1 LIKE '%_%'
と記述すると、”任意の1文字を含む”となりますので、Null 以外の全レコードがヒットしてしまいます。
ですから、全角の'%'、'_'の場合も半角の'%'、'_'と同じようにエスケープしてやらなければなりません。
SELECT * FROM TBL1 WHERE COL1 LIKE '%\_%' ESCAPE '\'
検索対象が JA16SJIS、JA16EUC、AL32UTF8 など、半角文字がシングルバイトで表されるようなキャラクタ・セットの場合はこれでOKです。
ところが、UTF16 など、半角文字がマルチバイトで表されるようなキャラクタ・セットの場合はこれでもまだうまくいきません。
例えば、各国語キャラクタ・セットが AL16UTF16 の場合、検索対象が NCHAR や NVARCHAR2 だと上記の以下のエラーが発生します。
ORA-01425: エスケープ文字は長さ1の文字列である必要があります
このエラーは以下のようにエスケープ文字を NCHAR に変換してやれば解消します。
SELECT * FROM TBL1 WHERE COL1 LIKE '%\_%' ESCAPE TO_NCHAR('\')
しかし、これでもまだうまくいきません。
さらに以下のエラーが発生します。
ORA-01424: エスケープ文字に続く文字がないか、または無効です。
このエラーは以下のように LIKE ではなく LIKEC を使うことによって解消します。
SELECT * FROM TBL1 WHERE COL1 LIKEC '%\_%' ESCAPE TO_NCHAR('\')
これで NCHAR、NVARCHAR2 でも正常に動作するようになります。
LIKE 条件で全角の'%'、'_'の扱い、特に NCHAR、NVARCHAR2 の場合は注意が必要です。
【関連エントリ】
[Oracle] ORA-01425エラーの回避方法 2004/07/29
[Oracle] LIKE 検索では全角の'%'、'_'も特殊文字として扱われる? 2007/04/10