Archive Redo Blog

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


テーマ:
SQL で LIKE 条件を使うとパターン一致検索が実行できます。

この時、'%'と'_'はそれぞれ任意の文字列、任意の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

AD
いいね!した人  |  コメント(2)  |  リブログ(0)

arbさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

最近の画像つき記事  もっと見る >>

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。