2013-05-16 5 views
5

Die folgendenWarum sind die Ergebnisse für 1 = NULL und 1! = NULL gleich?

IF 1 = NULL 
    BEGIN 
     SELECT 'A' 
    END 
ELSE 
    BEGIN 
     SELECT 'B' 
    END 

Gibt das Ergebnis B als

Hier erwartet, wo die Dinge

IF 1 != NULL 
    BEGIN 
     SELECT 'A' 
    END 
ELSE 
    BEGIN 
     SELECT 'B' 
    END 

gibt auch B

Warum ist dies der Fall wirklich interessant zu bekommen?

+3

Sie können nicht gleich 'nichts'. – sircodesalot

+1

'NULL' ist niemals gleich, ungleich größer oder kleiner als alles andere. –

+0

Wirklich? Es kann nicht gleich sein? –

Antwort

2

Stimmen Sie mit dem überein, was alle anderen schon gesagt haben. wenn Sie aus einem anderen Blickwinkel zu kommentieren, versuchen ansi_nulls zu Aus-Einstellung, können Sie bekommen, was Sie erwarten:

set ansi_nulls off 

if 1 = null 
    select 'a' 
else 
    select 'b' -- Returned 


if 1 != null 
    select 'a' -- Returned 
else 
    select 'b' 

Mehr Informationen von Online:

Wenn SET ANSI_NULLS ausgeschaltet ist, das Equals (=) und nicht gleich (<>) Vergleichsoperatoren folgen nicht dem ISO-Standard. Eine SELECT -Anweisung, die WHERE column_name = NULL verwendet, gibt die Zeilen mit Nullwerten in column_name zurück. Eine SELECT-Anweisung, die WHERE verwendet column_name <> NULL gibt die Zeilen zurück, die in der Spalte nichtnull Werte enthalten. Außerdem gibt eine SELECT-Anweisung, die WHERE column_name <> XYZ_value verwendet, alle Zeilen zurück, die nicht XYZ_value sind und die nicht NULL sind.

Das ist ansi_nulls off erklärt. Jedoch kann es nicht versucht, einfach abschalten, weil:

In einer zukünftigen Version von SQL Server, ANSI_NULLS immer ON sein und alle Anwendungen, die explizit die Option auf OFF gesetzt wird ein Fehler erzeugen. Vermeiden Sie die Verwendung dieser Funktion in neuen Entwicklungsarbeiten, und planen Sie , um Anwendungen zu ändern, die diese Funktion derzeit verwenden.

die unten Empfehlung folgen statt:

Für ein Skript wie vorgesehen arbeiten, unabhängig von der ANSI_NULLS Datenbank-Option oder die Einstellung von SET ANSI_NULLS, Verwendung IS NULL und IS NOT NULL in Vergleiche Das könnte Nullwerte enthalten.

if 1 is null 
    select 'a' 
else 
    select 'b' -- Returned 


if 1 is not null 
    select 'a' -- Returned 
else 
    select 'b' 
7

Weder IF Aussage ist wahr. NULL ist weder gleich noch etwas gleichwertig. Etwas entweder IS NULL oder IS NOT NULL.

0

Ich denke, NULL ist angegeben, dass es in gewisser Weise unvergleichbar ist durch <,>, =,! = Operatoren. Ein solcher Vergleich gibt wahrscheinlich NULL zurück. Dann wird die if(NULL) Verarbeitung übersprungen.

1

Sie können nicht vergleichen NULL = NULL - es hat keinen Wert.

SELECT 1 
WHERE NULL = NULL 

zurückkehrt nichts

Beim Vergleich NULL Werte verwenden IS nicht =

SELECT 1 
WHERE NULL IS NULL 

Reuturns 1

Von MSDN:

Um festzustellen, ob ein Ausdruck NULL ist, verwenden Sie IS NULL oder IS NOT NULL anstelle von Vergleichsoperatoren (wie = oder! =). Vergleich Operatoren geben UNBEKANNT zurück, wenn eines oder beide Argumente NULL sind.

http://msdn.microsoft.com/en-us/library/aa933227

1

Es ist ganz einfach. In ANSI Begriffe, jeder Ausdruck (logische oder arithmetische) NULL beteiligt hat unbekanntes Ergebnis:

(1 = NULL) IS UNKNOWN 
(1 <> NULL) IS UNKNOWN 
(1 + NULL) IS UNKNOWN 
(1 * NULL) IS UNKNOWN 

daher in beiden Fällen Sie in der ELSE-Zweig enden.

Versuchen Sie this Link für weitere Erklärungen.

+1

Von Ihrem Link _... werden alle Vergleiche mit einem Nullwert ausgewertet, um UNKNOWN_ Ihre Antwort zu korrigieren. –

+0

@ShannonSeverance Das klingt besser. Sie können SELECT 1 = NULL nicht abfragen - dies schlägt fehl. Ich werde mich an deinen Kommentar erinnern. –

+0

Das Vokabular ist verwirrt. PL/SQL hat einen booleschen Datentyp. Booleans können drei Werte annehmen: 'true',' false' und 'null'. –

2

Es ist weder gleich noch nicht-gleich NULL weil NULL keine Sache ist aber in der Tat, das Fehlen einer Sache.

ANSI SQL 1999 (noch nicht MSSQL) enthält eine Methode mit dem Namen IS [NOT] DISTINCT FROM, die unter NULL mit den erwarteten Ergebnissen verwendet werden kann.Hier

How to rewrite IS DISTINCT FROM and IS NOT DISTINCT FROM?

ist ein ausgezeichneter Beitrag auf IS DISTINCT FROM Verhalten und die Unübersichtlichkeit der NULL im Allgemeinen von Itzik Ben-Gan

http://sqlmag.com/sql-server/not-distinct

Das Prädikat auf TRUE auswerten kann, FALSCH oder UNBEKANNTE. Das Prädikat wird immer dann als UNBEKANNT ausgewertet, wenn NULL-Werte beteiligt sind.

Hier wünscht Erland Sommarskog für sie:

http://www.sommarskog.se/wishlist.html#isdistinctfrom

SQL: 1999 definiert die Betreiber unterscheidet sich von und aus dem NOT DISTINCT die gleiche wie < sind> und = bzw. außer dass sie auch für NULL-Werte gelten.

(Von Erland) hier ist ein Link auf Connect für MVP Steve Kass Anforderung der Funktion:

http://connect.microsoft.com/SQLServer/feedback/details/286422/add-language-and-optimizer-support-for-iso-distinct-predicate

Dies ist eine häufige Anforderung, aber das ist viele Spalten für die Codierung sowohl langweilig und fehleranfällig (vor allem wegen AND/OR precedence-Problemen). Das Ändern der Einstellung von ANSI_NULLS ist keine Lösung, da es Spalte-zu-Spalte-Vergleich nur Vergleiche zwischen Spalte zu Variablen nicht betrifft. Das Festlegen von ANSI_NULLS auf aus ist ebenfalls nicht Standard und nicht granular genug, um auf bestimmte Vergleiche in einer einzelnen Abfrage anzuwenden.

Verwandte Themen