2013-04-04 18 views
5

SQL Serverでは2つ以下のクエリの出力が異なり、Oracleでは同じ結果が得られるのはなぜですか?なぜSQL Serverでは出力が異なり、Oracleでは同じですか?

SELECT 20.0/-2.0/5 

SELECT 20/(-2.0)/5 
+3

**出力は何ですか。代わりに何を期待していますか? –

+0

@marc_s SQL Server 2008でそれぞれ '-50.000000000'と' -2.00000000'が得られましたが、両方とも '-50.000000000'になると予想します。 –

+0

両者ともMySQLで-2を返すことに注意してください。 –

答えて

4

私は出力が同じでなければならないというあなたの声明に同意しません。
20/-2/5の出力が何であるかを聞いたら、-2または-50の出力が可能であると答えるでしょう。実装の詳細によって異なります。

In Oracleあなたが知っているのは、演算子 '*'と '/'が '+'と ' - 'の前に評価されていることだけです。しかしそれだけです。私は、優先順位についてのドキュメントが見つかりません '*'と '/'の間の演算子に与えます。
2つのクエリで-2が得られるので、かっこは残されており、計算は左から右に行われます。

In SQL Server, the docs specified that

式中の2つの事業者が同一のオペレータ優先 レベルを有する場合、それらは 発現におけるそれらの位置に基づいて、左から右に評価されています。

ので、この計算は、仕様に準拠している:

20/2/5 = (20/2)/5 = 2 

は今カッコもう一度

20/(-2)/5 = (20/-2)/5 = -2 

括弧の変更そうではないだけを追加マイナス記号

20/-2/5 = 20/(-2/5) = -50 

を追加します注文は、マイナス記号も。

実際、結果は定義されていないとみなす必要があります。その結果は信頼できません。
よく定義された結果を得るためのかっこを追加し、頭痛を防ぎます。

+0

私は実装によってはRDBMSの違いがあると思いますが、括弧は同じRDBMSで異なる結果になるわけではありません。 –

+1

@AnthonyGrist:どうしてですか?基本的には定義されていないので、カッコを追加するなど、他の要因によって結果が大きく変わる可能性があります。あなたの質問に対する私の最新のコメントも見てください。 –

関連する問題