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

khác về kết quả. Lợi nhuận đầu tiên -10, số thứ hai 0. Rõ ràng là do lệnh đó gây ra.Thứ tự ưu tiên của phép nhân và phân chia

Nhưng tôi không thể tìm thấy bất kỳ thông tin nào mà các đơn vị có trọng số cao hơn so với phép nhân.

Nhìn vào http://technet.microsoft.com/en-gb/library/ms190276%28v=sql.105%29.aspx nhân và chia đang ở trên cùng cấp và đọc trên đó được viết

Khi hai nhà khai thác trong một biểu thức có cùng điều hành ưu tiên cấp, họ được đánh giá trái sang phải dựa trên họ vị trí trong biểu thức .

Về vấn đề này, truy vấn thứ hai nên được đánh giá như thế này: 100 * -1 -> result/10, phải không?

+2

tốt, bạn có một dấu trừ trong truy vấn của mình, cũng là toán tử. Hãy thử 'chọn 100 * (-1)/10 và thấy sự khác biệt ... –

Trả lời

1

Đây là lỗi "" trong tài liệu hoặc trong chính SQL Server: Theo liên kết của bạn, toán tử phủ định - có mức ưu tiên thấp hơn phép nhân và phép chia, nhưng nó có ảnh hưởng đến thứ tự đánh giá. Bạn có thể thấy điều này vì bạn chỉ đang sử dụng giá trị int sao cho kết quả là -1/10 trong 0. Nếu bạn muốn sử dụng arithmetics điểm nổi mọi thứ sẽ ổn thôi:

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

Hoặc bạn có thể sử dụng các biến để "ẩn" các phủ nhận:

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

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

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

Và như thường lệ với arithmetics phức tạp (phức tạp nghĩa hơn một toán tử), bạn có thể sử dụng dấu ngoặc đơn để thực thi một thứ tự đánh giá nhất định như @Mack được đề cập trong câu trả lời của mình.

0

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

Bạn cần phải cast lĩnh vực này là một trong hai thập phân hoặc float, hoặc thậm chí số.

Các vấn đề liên quan