2015-06-02 23 views
10

Lassen Sie uns sagen, ich habe eine Tabelle nameAge genannt:ungewöhnliche SQL Server Abfrageergebnis

ID Name Age 
1 X  12 
2 Y  12 
3 null null 
4 Z  12 

und wenn ich eine Abfrage wie ausgeführt:

select * from nameAge where Age <> 12 

es gibt mir ein leeres Ergebnis gesetzt, während ich Reihe haben mit id 3 wo ist age ist anders als null?

Verwenden Sql Server 2008 R2.

Irgendwelche Ideen?

Edit: Die Möglichkeit, mit der vorgeschlagenen Antwort Duplikat sein kann an einem Punkt, aber überhaupt nicht behandelt und es zeigt, wie Null-Werte im Vergleich zu null, aber was ich fragen wollte, war über die Ergebnismenge, die Null enthält Werte

+1

NULL ist nicht gleich 12 – sqluser

+1

@sqluser: Nein ist es nicht. Es ist auch nicht gleich 12. –

+0

möglich duplicate von [Nicht gleich <>! = Operator on NULL] (http://stackoverflow.com/questions/5658457/not-equal-operator-on-null) –

Antwort

16

Dies ist das beabsichtigte Verhalten. Sie können NULL Werte nicht mit = oder <> vergleichen. Sie müssen IS NULL oder IS NOT NULL verwenden.

Wenn Sie NULL Werte wollen nur IS NULL verwenden:

select * from nameAge where age IS NULL 

Wenn Sie NULL Werte mit age <> 12 Werte wollen, verwenden Sie:

select * from nameAge where age <> 12 OR age IS NULL 
+0

gute erklärung danke! – canpoint

+1

Hinweis: Sie können '=' und '<>' verwenden, wenn 'ANSI_NULLS' deaktiviert ist. –

+0

** Ein wichtiges Addendum: ** Der Check 'NULL <> 12' wird nicht false zurückgeben, sondern einen booleschen NULL zurückgeben. Das wird wie ein falscher Wert behandelt, aber ** kann nicht negiert werden ** Also ist 'NOT (NULL <> 12)' immer noch boolesch NULL und nicht wahr. – Falco

8

Der Ausdruck

WHERE NULL <> 12 

nicht zurück TRUE oder FALSE, gibt aber tatsächlich UNKNOWN zurück. Dies bedeutet, dass der dritte Datensatz in Ihrer Tabelle von Ihrer Abfrage nicht zurückgegeben wird.

Wie @ughai erwähnt, sollten Sie IS NULL verwenden, anstatt diesen Datensatz abfragen:

SELECT * FROM nameAge WHERE age IS NULL 

Werfen Sie einen Blick auf die Microsoft SQL Server documentation für weitere Informationen.

+2

Nach dem SQL-Standard ist das Ergebnis "UNBEKANNT" anstatt "NULL". [tag: mysql] fügt "NULL" und "UNKNOWN" zusammen, aber die meisten anderen Datenbankprodukte (die ich kenne) nicht. –

+0

@Damien_The_Unbeliever Danke, dass Sie darauf hingewiesen haben, und ich habe meine Antwort mit einem Link zur offiziellen Microsoft-Dokumentation aktualisiert. –

4

Wenn Sie mit NULLs beschäftigen sollten Sie wegen der 3 Werte-Logik in Sql Server verwendet immer vorsichtig sein (wenn ein Prädikat TRUE, FALSE oder UNKNOWN zu bewerten). Jetzt ist hier eine klassische select Anweisung, wo viele Neulinge einen Fehler machen, was darauf hindeutet, dass die Anweisung alle Zeilen zurückgeben würde, in denen Age <> 12 einschließlich NULLs enthalten ist.

Aber wenn Sie die einfache Tatsache wissen, dass der Vergleich NULL mit einem beliebigen Wert, selbst NULL selbst UNKNOWN auswerten wird es klarer wird, was vor sich geht. Die WHERE-Klausel gibt ONLY jene Zeilen zurück, in denen das Prädikat zu TRUE ausgewertet wird. Zeilen, bei denen das Prädikat FALSE oder UNKNOWN ergibt, werden aus resultset herausgefiltert.

Jetzt wollen wir sehen, was hinter der Szene vor sich geht.Sie haben 4 Zeilen:

ID Name Age 
1  X  12 
2  Y  12 
3  null null 
4  Z  12 

und das Prädikat:

where Age <> 12 

Wenn Sie dieses Prädikat für jede Zeile bewerten Sie erhalten:

ID Name Age Evaluation result 
1  X  12 FALSE    --(because 12 <> 12 is FALSE) 
2  Y  12 FALSE    --(because 12 <> 12 is FALSE) 
3  null null UNKNOWN   --(because NULL <> 12 is UNKNOWN) 
4  Z  12 FALSE    --(because 12 <> 12 is FALSE) 

Jetzt nicht vergessen, dass WHERE Klausel nur zurück Zeilen, bei denen das Prädikat zu TRUE auswertet und es ist klar, dass Sie kein Ergebnis erhalten werden, da keine Zeile TRUE auswertet.

Verwandte Themen