- Si ejecuta
SELECT -100/-100*10
el resultado es0
. - Si ejecuta
SELECT (-100/-100)*10
el resultado es10
. - Si ejecuta
SELECT -100/(-100*10)
el resultado es0
. - Si ejecuta
SELECT 100/100*10
el resultado es10
.
BOL declara:
Cuando dos operadores de una expresión tienen el mismo nivel de precedencia de operadores, se evalúan de izquierda a derecha según su posición en la expresión.
Y
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
¿BOL está mal o me falta algo? Parece que -
está descartando la precedencia (esperada).
-
parece estar causando que el flujo "salga mal". Si lo intentas -100/(-100)*10
, obtienes el resultado 10
. parece que /
se está aplicando el valor -
en la ecuación y luego 100*10
se está determinando la ecuación . No estoy seguro de que esto sea un error con BOL, pero más que SQL Server no se está comportando como se esperaba. Podría valer la pena plantear un problema sobre sql-docs y ver cuál es su respuesta; tal vez podría agregarse una nota a la documentación informando sobre la "característica".
SELECT -100/(-100)*10
también devuelve 10. Parece que -
se trata como el -
operador que debe aplicarse solo después de que 100*10
se calcula
A / -B * C
es A <div> <negate> B <multiply> C
. Negar tiene menor precedencia que multiplicar, según los documentos, por lo que el resultado es A / -(B * C)
. Puede ver esto más claramente usando constantes flotantes: 12e / -13e * 14e
vs 12e / (-13e) * 14e
vs. 12e / 13e * 14e
La razón por la que esto nos desconcierta es porque generalmente esperamos que los menos unarios se conviertan en parte del literal, o al menos tengan una precedencia muy alta, pero no es así como T-SQL trabajos.