Was ist der Unterschied zwischen! = Und ist nicht? Und Nulls im Allgemeinen

Ich habe ein bisschen Schwierigkeiten zu verstehen, wie t-sql null Werte behandelt.

Als C # Kerl neige ich dazu, zu tun

IF(@myVar != null)... 

Aber das scheint niemals meinen Code zu laufen. So ich mache

 IF(@myVar is not null) 

Was ist der Unterschied?

Zweitens ist die Art und Weise, wie es funktioniert, unklar. Sagen wir mal

 declare @someCount int, @someFinalResult int --Select that returns null SELECT @someCount = columnName from tableName where someColumn = someValue 

Dann, wenn ich es tue

 SET @someFinalResult = @someCount + 1--I seem to get NULL if I had null + something 

Aber wenn ich zum ersten Mal

 declare @someCount int, @someFinalResult int --FIRST SET DEFAULT TO 0 SET @someCount = 0 --Select that returns null SELECT @someCount = columnName from tableName where someColumn = someValue 

Nun ist @someCount standardmäßig auf 0 gesetzt, es ist nicht gleich gleich NULL, auch wenn das Ergebnis null ist. Warum?

Wenn Sie mit NULL in SQL server umgehen, arbeiten Sie grundsätzlich mit 3-Wert-Logik mit allen Implikationen .

Also in deinem Beispiel

IF(@myVar != null) vs IF(@myVar is not null)

Im Grunde geht es auf die Frage, was ist der Unterschied zwischen: @myVar = null vs @myVar is null

@myVar = null wird immer auswerten, um zu null, was du @myVar = null :

ist der Wert in @myVar gleich UNKNOWN

Wie Sie nicht wissen, was die UNKNOWN ist, kann diese Frage nicht mit Ja beantwortet werden, oder nein, also bewertet es UNKNOWN

 eg "is 1 = UNKNOWN" - I do not know "is 'a' = UNKNOWN" - I do not know "is UNKNOWN = UNKNOWN" - I do not know 

Die letzte kann ein bisschen schwierig sein, aber stell dir vor, dass du 2 Boxen mit Äpfeln hast und du weißt auch nicht, wie viele Äpfel in box1 ein noch in box2 sind und so fragen:

 is count(box1) = count(box2) is the same as is UNKNOWN = UNKNOWN" 

Also die Antwort ist, I do not know

die zweite @myVar is null ist anders, wie es ist wie zu fragen

 is the value in @myVar UNKNOWN 

also der Unterschied ist, dass Sie speziell fragen "ist es wahr, dass der Wert in der variables gespeichert ist UNKNOWN?", so

  "is 1 UNKNOWN" - NO "is 'a' UNKNOWN" - NO "is UNKNOWN UNKNOWN" - YES 

Im Allgemeinen ist es so: NULL ist unbekannt, also !=NULL ist auch unbekannt, weil man nicht weiß, ob es gleich ist oder nicht. Und du weißt noch weniger, ob zwei Unbekannte gleich sind Dasselbe gilt für mehr oder weniger jede Operation mit Unbekannten, wenn man etwas Unbekanntes hinzufügt, ist das Ergebnis dir kaum noch bekannt.