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

不同結果。首先返回-10,第二個0。顯然這是由訂單造成的。乘法和除法的順序優先順序

但是我找不到任何信息,這些信息的分數比乘法的權重更高。

看着http://technet.microsoft.com/en-gb/library/ms190276%28v=sql.105%29.aspx 乘法和除法都在同一水平上讀到的書面

當兩個運營商的表達具有相同的運算符優先級 水平,他們是從左向右計算基於其在 表達式中的位置。

對此,第二個查詢應該這樣評估:100 * -1 -> result/10,不應該嗎?

+2

好吧,您的查詢中有一個「減號」,它也是一個運算符。嘗試'選擇100 *(-1)/ 10並查看差異... –

回答

1

這可能是文檔或SQL Server本身的「缺陷」:根據您的鏈接,負運算符-的運算符優先級低於乘法和除法運算符,但它會影響評估順序。你可以看到這個,因爲你只使用int值,所以-1/10結果爲0。 如果你想使用浮點算術一切都會好起來:

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 

和往常一樣複雜的算術(復指超過一個運算符),您可以使用括號來執行某些評估順序,如他在答案中提到的@Mack。

0

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

你需要轉換字段作爲十進制或浮動,甚至數字。