これはおそらくOracleパーサの奇妙さです。Oracleで文字列値を受け入れる前にプラス記号(+)を使用するのはなぜですか?
次のクエリが機能します。最後の行で+の前に 'Y'があることに注意してください。
SELECT *
FROM (SELECT 'Y' AS field FROM DUAL
UNION ALL
SELECT 'X' AS field FROM DUAL) t
WHERE t.field = +'Y'
なぜOracleパーサーはこれを受け入れますか?もう一度、古い外部結合構文のためだと思っていましたが、その構文では+はかっこで囲まれています。
これは同様に動作します。
select +'Y1' from dual;
これ:
select 'A' || + 'Y1' from dual;
これは(Oracleは文字列を数値に変換する)動作:
select -'1' from DUAL;
なく、この([エラー]実行(223:9):ORA-01722:無効な番号 ):
select -'A' from DUAL;
なぜvarchar2の値よりも前に+を使用できるのだろうと思います。 Arithmetic Operatorsセクションには、文字列値に適用される特定の規則は記載されていません。
面白いです。パーサは解析するだけでデータ型は考慮されず、+は有効な式です。単項式+は式を変更せず、最適化することができるため、適用される最適化でもあります。 'SELECT - - 1 FROM DUAL'をチェックしただけで、これは文法的に間違っています(matematicは正しいが)。 –
Husqvik
@Husqvik、面白いです。算術演算子ページのOPリンクには、二重否定のための '--'に対する警告があります。これは、コメントを開始するためです。スペースや括弧で区切ると言っています。 –
@ Husqvik:私がパーサーと言ったとき、スタック全体、パーサー、コンパイラ、オプティマイザなどを意味していました。はい+が有効です。私は二重の作品からselect - -1と思ったでしょう。 - - 1はc#、javascript、javaでは有効ですが、scalaでは有効ではありません。 –
costa