- Wenn Sie
SELECT -100/-100*10
das Ergebnis ausführen, ist0
. - Wenn Sie
SELECT (-100/-100)*10
das Ergebnis ausführen, ist10
. - Wenn Sie
SELECT -100/(-100*10)
das Ergebnis ausführen, ist0
. - Wenn Sie
SELECT 100/100*10
das Ergebnis ausführen, ist10
.
BOL sagt:
Wenn zwei Operatoren in einem Ausdruck dieselbe Operatorprioritätsstufe haben, werden sie basierend auf ihrer Position im Ausdruck von links nach rechts ausgewertet.
Und
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
Ist BOL falsch oder fehlt mir etwas? Es scheint, dass das -
den (erwarteten) Vorrang abwirft.
sql
sql-server
tsql
operator-precedence
cuizizhe
quelle
quelle
-
scheint den Fluss "falsch" zu machen. Wenn Sie versuchen, erhalten-100/(-100)*10
Sie das Ergebnis10
. es scheint, dass das/
gegen den Wert-
in der Gleichung angewendet wird und dann die Gleichung100*10
bestimmt wird. Ich bin nicht sicher, ob dies ein Fehler bei BOL ist, aber mehr noch, dass sich SQL Server nicht wie erwartet verhält. Es könnte sich lohnen, ein Problem mit SQL-Dokumenten anzusprechen und zu sehen, wie sie darauf reagieren. Vielleicht könnte der Dokumentation, die über die "Funktion" informiert, ein Hinweis hinzugefügt werden.SELECT -100/(-100)*10
gibt auch 10 zurück. Es sieht so aus,-
als würde der-
Operator behandelt, der erst angewendet werden sollte, nachdem er100*10
berechnet wurdeA / -B * C
istA <div> <negate> B <multiply> C
. Negieren hat gemäß den Dokumenten eine niedrigere Priorität als Multiplizieren. Das Ergebnis ist alsoA / -(B * C)
. Sie können mit Floating - Konstanten dies deutlicher sehen:12e / -13e * 14e
vs12e / (-13e) * 14e
vs12e / 13e * 14e
.Die Grunde , dies uns abwirft, weil wir in der Regel einstelliger minus erwarten Teil der wörtlichen zu werden, oder zumindest eine sehr hohe Priorität, aber das ist nicht , wie T-SQL funktioniert.Antworten:
Gemäß der Präzedenztabelle, dies ist das erwartete Verhalten. Der Operator mit höherer Priorität (
/
und*
) wird vor dem Operator mit niedrigerer Priorität (unär-
) ausgewertet . Also das:wird bewertet als:
Beachten Sie, dass sich dieses Verhalten von den meisten Programmiersprachen unterscheidet, bei denen die unäre Negation eine höhere Priorität hat als die Multiplikation und Division, z . B. VB , JavaScript .
quelle
-
als Operator in betrachtet wird-100
. In einigen Sprachen ist es Teil der Syntax einer Ganzzahl.-
.BOL ist richtig.
-
hat eine niedrigere Priorität als*
, sowird analysiert als
Da die Multiplikation so ist, wie sie ist, bemerken Sie dies normalerweise nicht, außer wenn Sie die beiden anderen binären Operatoren mit gleicher Priorität einmischen:
/
und%
(und%
wird in solchen zusammengesetzten Ausdrücken selten verwendet). SoWird analysiert als
Erklärung der Ergebnisse. Dies ist nicht intuitiv, da in den meisten anderen Sprachen unäres Minus eine höhere Priorität als
*
und hat/
, jedoch nicht in T-SQL, und dies wird korrekt dokumentiert.Eine schöne (?) Art, es zu veranschaulichen:
erzeugt einen arithmetischen Überlauf, da
-(1073741824 * 2)
produziert2147483648
als Zwischenprodukt, das in einem nicht paßtINT
, abererzeugt das erwartete Ergebnis
-2147483648
, was tut.quelle
-
ist "negativ". Leute, die Dinge wie "minus 10" sagen, wenn sie "negative 10" bedeuten, sind ungenau.-
Betreiber, wenn sie an einen einzelnen Operanden angewendet wird , wird aufgerufen ,MINUS
in SQL - Abfrage - Pläne. Sein binäres Gegenstück heißtSUB
. Wenn Sie möchten, interpretieren Sie "unäres Minus" als Abkürzung für "den durch das Minuszeichen gekennzeichneten unären Operator" - eher eine syntaktische als eine semantische Bezeichnung.Beachten Sie in der Dokumentation, dass (möglicherweise nicht intuitiv) die Rangfolge für
- (Negative)
dritter ist.So erhalten Sie effektiv:
-(100/-(100*10)) = 0
Wenn Sie sie in Variablen einfügen, wird dies nicht angezeigt, da nach der Multiplikation keine unäre Operation auftritt.
Hier sind also A und B gleich, während C, D, E das Ergebnis zeigen, das Sie sehen (wobei E die vollständige Klammer hat).
quelle