Oracleエラー対応(ORA-00920):「関係演算子が無効です」の対処方法について

現役DBAが解説 ~Oracleエラー対応~

SQLを実行する機会が多い方は、よくORA-00920に遭遇すると思います。
今回はエラー事例を元にORA-00920の原因・対策について説明します。

1. エラーメッセージ

ORA-00920: 関係演算子が無効です。

2. 事象・原因・対策

本記事では ORA-00920が発生するケースの中で代表的なものを2例記載します。

①比較演算子の指定に誤りがあるケース

比較演算子とは以下の記号のことを指し、主にWHERE句での比較処理に使用されます。

「= 一致」、「< > != 不一致」、「>= <=> < 大なり/小なり」

これらの演算子の指定に誤りがあるとORA-00920が発生するので、演算子の指定には注意が必要です。
以下に正常ケースとエラーケースの例文を記載します。

例1:正常終了とORA-00920エラー

SQL> select 'test' from dual where 1 = 1;	
	
'TEST'	
--------	
test	
	
SQL> select 'test' from dual where 1;	
select 'test' from dual where 1	
                              *	
行1でエラーが発生しました。:	
ORA-00920: 関係演算子が無効です。	
	
SQL>	

例1では「where 1 = 1(右辺と左辺が一致)」として比較条件を指定しています。
ここで「=」の演算子を無くすことでORA-00920を発生させています。
他の演算子でも同様に比較条件が間違っているとエラーになります。

例2:比較条件が間違っている他の演算子

SQL> select 'test' from dual where 1 => 1;	
select 'test' from dual where 1 => 1	
                                                 *	
行1でエラーが発生しました。:	
ORA-00920: 関係演算子が無効です。	
	
SQL> select 'test' from dual where 1 := 1;	
select 'test' from dual where 1 := 1	
                                *	
行1でエラーが発生しました。:	
ORA-00920: 関係演算子が無効です。	
	
SQL>	

例2では「= 一致」、「>= 以上」の演算子が間違った形で指定されてるため、ORA-00920が発生しています。
補足として、比較条件の内容次第では他のエラー「ORA-00936: 式がありません。」、「ORA-00927: 等号がありません。」が発生します。

②グループ比較演算子の指定に誤りがあるケース

グループ比較演算子「ANY 条件のいずれかに一致」、「ALL 条件の全て一致」、「IN =ANYと同様」を使用した場合でも、ORA-00920が発生します。
「=ANY」を使用した正常ケースとエラーケースの例文は以下になります。

例3:正常終了とORA-00920エラー

SQL> select 'test' from dual where 1 = ANY (0,1,2);		
		
'TEST'		
--------		
test		
		
SQL> select 'test' from dual where 1 ANY (0,1,2);		
select 'test' from dual where 1 ANY (0,1,2)		
                                *		
行1でエラーが発生しました。:		
ORA-00920: 関係演算子が無効です。		
		
SQL>		

そのほかにも、「1つの値とグループ値」ではなく、「グループ値とグループ値」の比較条件でも間違っているとORA-00920が発生します。

例4:正常終了とORA-00920エラー

SQL> select 'test' from dual where (0,1) = ANY ((0,1),(2,3));		
		
'TEST'		
--------		
test		
		
SQL> select 'test' from dual where (0,1) = ANY (0,1,2,3);		
select 'test' from dual where (0,1) = ANY (0,1,2,3)		
                                                                 *		
行1でエラーが発生しました。:
ORA-00920: 関係演算子が無効です。		
		
SQL> select 'test' from dual where (0,1) = ((0,1),(2,3));		
select 'test' from dual where (0,1) = ((0,1),(2,3))		
                                                       *		
行1でエラーが発生しました。:		
ORA-00920: 関係演算子が無効です。		
		
SQL> select 'test' from dual where (0,1) = (0,1);		
select 'test' from dual where (0,1) = (0,1)		
                                                         *		
行1でエラーが発生しました。:		
ORA-00920: 関係演算子が無効です。		
		
SQL>		

4. 最後に

本エラーは演算子の記述付近に原因がある場合が多いので、発生箇所の特定も容易です。

対応としては、演算子を正しく記述すれば解決するので、上記の正常時とエラー時の演算子を参考にしていただければ幸いです。