2015-11-24 4 views
5

これはおそらく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セクションには、文字列値に適用される特定の規則は記載されていません。

+0

面白いです。パーサは解析するだけでデータ型は考慮されず、+ は有効な式です。単項式+は式を変更せず、最適化することができるため、適用される最適化でもあります。 'SELECT - - 1 FROM DUAL'をチェックしただけで、これは文法的に間違っています(matematicは正しいが)。 – Husqvik

+0

@Husqvik、面白いです。算術演算子ページのOPリンクには、二重否定のための '--'に対する警告があります。これは、コメントを開始するためです。スペースや括弧で区切ると言っています。 –

+0

@ Husqvik:私がパーサーと言ったとき、スタック全体、パーサー、コンパイラ、オプティマイザなどを意味していました。はい+ が有効です。私は二重の作品からselect - -1と思ったでしょう。 - - 1はc#、javascript、javaでは有効ですが、scalaでは有効ではありません。 – costa

答えて

5

単項+演算子はアイデンティティのように定義されてAbout SQL OperatorsTable 4-1 "SQL Operator Precedence"を参照してください。また

select + date '2015-01-01' from dual; 

1月、01追加する編集2015年午後12時00分○○秒


"Identity"は引数を返します。異なる言語の別の例については、Clojureのidentity関数を参照してください。ウィキペディアには"identity function"のページがあります。

+1

この文脈でアイデンティティは何を意味しますか? – costa

関連する問題