※ この記事にはアフィリエイトリンクが含まれます
OracleでSQLを実行したときに、こんなエラーが出たことはありませんか?
ORA-00920: 関係演算子が無効です一見すると「演算子の書き方を間違えたのかな?」と思いますが、実はそうでもないケースがあります。
私がこのエラーに遭遇したときは、WHERE句の文字列内にシングルクォーテーション(’)が含まれていたのが原因でした。
本記事では、私が実際に体験した「関係演算子が無効です」エラーの原因と、再発防止のための具体的な対策をわかりやすく解説します。
エラー内容と発生状況
まず、実際に発生したエラー内容はこちらです。
ORA-00920: 関係演算子が無効です実行していたSQLはこのようなものでした。
SELECT * FROM USERS WHERE NAME = 'O'Connor';ぱっと見では特に問題なさそうですが、実はこの O'Connor の中にある '(シングルクォーテーション)が曲者です。
Oracleは ' を文字列の始まりと終わりを示す記号として使うため、途中に ' が混ざると構文が壊れてしまうのです。
私の場合は、Excelやアプリの入力値をそのままWHERE句に差し込んでおり、
文字列中に ' が含まれても気づかずにSQLを実行していたのが原因でした。
シングルクォーテーションがSQL文を壊していた
Oracleでは、文字列を' で囲みます。
WHERE NAME = 'Yamada';ところが、文字列内にも' が入っていると、SQL解析時にそこまでを1つの文字列としてみなしてしまいます。
WHERE NAME = 'O'Connor';このSQLはOracleから見ると、「'O' までが文字列で、Connor' が意味不明な文字列」
になってしまい、結果として「関係演算子が無効です(ORA-00920)」という構文エラーが発生します。
対策1:シングルクォートをエスケープする
SQL文内で ' を扱いたい場合は、2つ連続で書くことで1つの ' として扱われます。
SELECT * FROM USERS WHERE NAME = 'O''Connor';これで構文が正しくなり、正常に実行できます。
対策2:バインド変数を使う
Oracleでは、SQLに値を直接埋め込む代わりに、バインド変数を使う方法が推奨されています。
SELECT * FROM USERS WHERE NAME = :name;バインド変数を使えば、Oracleが内部的に文字列を安全に処理してくれるため、
シングルクォートを意識する必要がなくなります。
また、SQLインジェクション対策としても有効なので、
開発現場ではこちらの方法を強くおすすめします。
対策1、対策2の具体的な説明をこちらの記事にて行なっているので、ぜひご覧ください。

補足:関係演算子が無効ですエラーのその他の原因
「関係演算子が無効です」は、シングルクォーテーション以外にも以下のような原因で発生することがあります。
| 原因例 | 内容 |
|---|---|
| 比較演算子の誤り | == を使用している(正しくは =) |
| NULL比較の誤り | = NULL としている(正しくは IS NULL) |
| カッコの閉じ忘れ | 括弧の対応が取れていない |
| サブクエリ内のカラム不整合 | 比較対象の型が異なる |
もしシングルクォーテーションを疑っても解決しない場合は、
一度SQL文をフォーマットして、構文の対応関係を丁寧に確認してみると良いでしょう。
今後さらに Oracle の知識を深めたい方は、実務で役立つ書籍やトレーニングを活用しながら体系的に学ぶのがおすすめです。私がおすすめする書籍を紹介します。
図解入門よくわかる 最新Oracleデータベースの基本と仕組み
図解で解説されている箇所が多く、初心者が全体像を理解するのに最適です。
Oracleの現場を効率化する100の技
初心者からベテランまで、経験レベルを問わず活用できる一冊で、Oracle Databaseユーザー必携の実践書 といえます。
忙しい現場でも、効率的に学びながら実践できる点が魅力。
データベーススキルを活かしてキャリアを広げたい方は、エンジニア転職サイトを活用するのも一つの手です。おすすめの転職サイトをまとめた記事がありますので、ぜひご覧ください。

コメント