2013-11-28 2 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

ну, у вас есть «минус» в вашем запросе, который также является оператором. Попробуйте 'select 100 * (-1)/10 и посмотрите разницу ... –

ответ

1

Это либо «недостаток» в документации, либо в самом SQL-сервере: по вашей ссылке отрицательный оператор - имеет более низкий приоритет оператора, чем умножение и деление, но это влияет на порядок оценки. Вы можете видеть это, потому что вы используете только значения 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)

Вы должны бросить поле либо десятичном или поплавок, или даже числовые.

Смежные вопросы