2013-11-28 8 views
5
SELECT -1 * 100/10 
SELECT 100 * -1/10 

の結果が異なります。最初に-10を返し、2番目に0を返します。 明らかに、注文に起因しています。乗除算の優先順位

しかし、私は部門が乗算よりも重み付けが高いという情報はありません。 http://technet.microsoft.com/en-gb/library/ms190276%28v=sql.105%29.aspx 乗算、除算を見てみると

は同じレベルにあり、上読んで、それを

を書かれている表現に2つの事業者が同じ演算子の優先順位 レベルを持っている場合、彼らは彼らに基づいて左から右に評価されています 式の位置。

これに関して、2番目のクエリは次のように評価する必要があります。100 * -1 -> result/10、そうではありませんか?

+2

うまくいけば、クエリにはマイナスがあります。これは演算子です。 'select 100 *(-1)/ 10を試してみて、違いを見てください... –

答えて

1

これはドキュメントまたはSQL Server自体の「欠陥」です。あなたのリンクによれば、負の演算子-は乗算と除算よりも演算子の優先度が低くなりますが、評価の順番に影響します。これは、-1/10の結果が0になるようにint値のみを使用しているために表示されます。 あなたは浮動小数点演算を使用する場合はすべてがうまく次のようになります。

SELECT -1 * 100/10.0 
SELECT 100 * -1/10.0 

それとも、「隠す」否定する変数を使用することができます。複合体はより多くを意味します(複雑な算術演算で

DECLARE @a int 
DECLARE @b int 
DECLARE @c int 

SELECT @a=-1, @b=100, @c=10 

SELECT @a*@b/@c 
SELECT @b*@a/@c 

そして、いつものように1つの演算子)、@Mackのような評価の順序を強制するために、括弧を使って答えを述べることができます。

0

select 100 *-Cast(1 as float)/Cast(10 as float)

あなたは、10進数または浮動小数点数、あるいは数値のどちらかとして、フィールドをキャストする必要があります。