- Jika Anda mengeksekusi
SELECT -100/-100*10
hasilnya adalah0
. - Jika Anda mengeksekusi
SELECT (-100/-100)*10
hasilnya adalah10
. - Jika Anda mengeksekusi
SELECT -100/(-100*10)
hasilnya adalah0
. - Jika Anda mengeksekusi
SELECT 100/100*10
hasilnya adalah10
.
BOL menyatakan:
Jika dua operator dalam ekspresi memiliki tingkat prioritas operator yang sama, mereka dievaluasi dari kiri ke kanan berdasarkan posisinya dalam ekspresi.
Dan
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
Apakah BOL salah, atau saya melewatkan sesuatu? Tampaknya -
membuang prioritas (diharapkan).
-
tampaknya menyebabkan aliran menjadi "salah". Jika Anda mencoba, -100/(-100)*10
Anda mendapatkan hasilnya 10
. tampaknya nilai /
tersebut diterapkan terhadap nilai -
dalam persamaan dan kemudian persamaan 100*10
tersebut ditentukan. Saya tidak yakin ini adalah kesalahan dengan BOL, tetapi lebih dari itu SQL Server tidak berfungsi seperti yang diharapkan. Mungkin ada baiknya mengangkat masalah di sql-docs dan melihat apa tanggapan mereka di sana; mungkin sebuah catatan bisa ditambahkan ke dokumentasi yang menasihati "fitur".
SELECT -100/(-100)*10
juga mengembalikan 10. Sepertinya -
diperlakukan sebagai -
operator yang harus diterapkan hanya setelah 100*10
dihitung
A / -B * C
adalah A <div> <negate> B <multiply> C
. Negasi memiliki prioritas yang lebih rendah daripada kalikan, sesuai dokumen, jadi hasilnya adalah A / -(B * C)
. Anda dapat melihat ini lebih jelas dengan menggunakan konstanta mengambang: 12e / -13e * 14e
vs. 12e / (-13e) * 14e
vs. 12e / 13e * 14e
Alasan ini membuat kita bingung adalah karena kita umumnya mengharapkan minus unary menjadi bagian dari literal, atau setidaknya memiliki prioritas yang sangat tinggi, tetapi itu bukan cara T-SQL bekerja.