2015-07-22 10 views
7

Ich stieß auf diese beim Ändern der Ansicht eines anderen in SQL Server.Gibt es einen Unterschied zwischen NOT (Spaltenname wie '% a%') und Spaltenname nicht wie '% a%'

Gibt es Unterschiede zwischen:

NOT (ColumnName LIKE '%a%') 

und

ColumnName NOT LIKE '%a%' 

es irgendwelche Performance-Unterschiede oder einen Unterschied in den Ergebnissen? Oder ist das nur ein weiterer seltsamer Weg (merkwürdig für mich), dass SQL Server Ihren Code ändert, wenn Sie einen Abfrage-Generator oder einen Builder für Ansichten verwenden?

+1

@tinka: warum ist das genau?) – potashin

Antwort

9

Nein, es gibt keinen Unterschied.

Die beiden Syntaxen sind beide sinnvoll - not like ist die klarere, aber es ist nicht so, dass Sie einfach not (ein einfacher unärer boolescher Operator) in solchen Fällen deaktivieren können.

In den meisten Fällen ist die Form der Abfrage für die Leistung nicht wirklich wichtig - jedes Mal, wenn sie es tut, sehen Sie wahrscheinlich einen kleinen Fehler im Ausführungsplaner. Bevor die Abfrage irgendwo kurz vor der Ausführung steht, wird sie auseinandergerissen, analysiert und zu den eigentlichen Schritten zusammengesetzt, um die Ergebnisse zu erhalten - wann immer Sie sich fragen, was in einer Anfrage wirklich passiert, führen Sie es einfach mit Include tatsächlichen Ausführungsplan aus, und Sie ' Ich werde sehen.

Wenn Sie ein Mensch sind, gibt es keinen Grund, nicht not like zu verwenden - Sie würden den anderen Weg als Teil einer automatischen Code-Generierung verwenden (negieren das Ergebnis eines anderen Ausdrucks), nicht in menschlichen geschriebenen Code. Es sei denn, Sie erstellen diese Abfrage, indem Sie natürlich Strings zusammenschlagen - dann könnte es sogar Sinn ergeben, wenn Sie es selbst schreiben.

Oh, und für Stil, beachten Sie, dass wie gesagt, not ist ein Operator, kein Funktionsaufruf. So ist die richtige Art und Weise Klammern zu verwenden, würde entweder

not ColumnName like '%a%' 

oder besser sein,

(not ColumnName like '%a%') 

oder, wenn du verrückt bist (oder wieder, Code-Generierung):

(not (ColumnName LIKE '%a%')) 

Verwendung Die Funktionsaufrufsyntax könnte für einige verwirrend sein - und die Operatorpräzedenz in T-SQL ist nicht gerade intuitiv (es versucht zu schwer, einfach zu sein und vermeidet Klammern, was manchmal verwirrend ist). Die meisten SQL-Generatoren neigen dazu, vorsichtig zu sein, und verwenden mehr Klammern als unbedingt notwendig, was normalerweise zu besserer Lesbarkeit (und Korrektheit :) führt, während sie keine bedeutungsvollen Auswirkungen auf die Leistung oder irgendetwas haben.

+0

Vielen Dank für die umfassende Antwort! – ASindleMouat

Verwandte Themen