[Oracle] ORA-01425エラーの回避方法 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

NCHARやNVARCHAR2の文字列に対してエスケープ文字を使用したLIKE検索を行うと、

ORA-01425: エスケープ文字は長さ1の文字列である必要があります


というエラーが発生します。



例えば、PRODUCTテーブルからPRODUCT_NAMEが'ABC_001'で始まるPRODUCT_NAMEを検索したい場合、以下のようなSELECT文を書くでしょう。

SELECT PRODUCT_NAME FROM PRODUCT WHERE PRODUCT_NAME LIKE 'ABC\_001%' ESCAPE '\'

LIKE演算子を使った検索では'_'は任意の1文字を表すため、文字列の'_'を検索する場合にはエスケープ文字を指定しなくてはならないのでこのように記述するのですが、比較対象となるカラムがNCHARやNVARCHAR2といったデータ型の場合、この記述だとORA-01425が発生するのです。

エラーメッセージをそのまま解釈すると、1文字しか指定してないのに何で???となりますが、どうも比較対象のカラムがNCHARやNVARCHAR2といったマルチバイトのデータ型の場合は、エスケープ文字を1文字とは解釈してくれないようです。

このエラーを回避するには、NCHAR、NVARCHAR2を使用しないようにするか、以下のように比較対象となるカラムをCHARに変換してやるか、

SELECT PRODUCT_NAME FROM PRODUCT WHERE TO_CHAR( PRODUCT_NAME ) LIKE 'ABC\_001%' ESCAPE '\'

ESCAPE文字をNCHARに変換していやるしかありません。


SELECT PRODUCT_NAME FROM PRODUCT WHERE PRODUCT_NAME LIKE 'ABC\_001%' ESCAPE TO_NCHAR('\')

WHERE句の左辺に関数を使うとパフォーマンス的によくなさそうなので、変換するならESCAPE文字を変換した方が良さそうです。




【関連エントリ】
[Oracle] ORA-01425エラーの回避方法 2004/07/29
[Oracle] LIKE 検索では全角の'%'、'_'も特殊文字として扱われる? 2007/04/10