2012-03-06 12 views
82

Powiel możliwe:
what is “=null” and “ IS NULL”
Is there any difference between IS NULL and =NULLSQL jest nieważna i = null

Jaka jest różnica między

where x is null 

i

where x = null 

i dlaczego te ostatnie nie działają?

+7

Ponieważ wynikiem dowolnego porównania arytmetycznego z wartością NULL jest również NULL, nie można uzyskać żadnych znaczących wyników z takich porównań - http://dev.mysql.com/doc/refman/5.0/en/working-with-null. html – scibuff

Odpowiedz

90

W SQL porównanie między wartością null i wszelkie inne wartość (w tym inny null) za pomocą operatora porównania (np. =, !=, <, itp.) spowoduje, że null, który jest uważany za false dla celów klauzuli where (ściśle rzecz biorąc, to "nie jest prawdą", a nie "fałsz", ale efekt jest taki sam).

Rozumowanie jest takie, że null oznacza "nieznany", więc wynik jakiegokolwiek porównania z null jest również "nieznany". Więc nie otrzymasz trafienia w wiersze przez kodowanie where my_column = null.

SQL zapewnia specjalną składnię do testowania, czy kolumna null poprzez is null i is not null, który jest szczególnych warunków do badania na null (lub nie jest null).

Oto niektóre SQL przedstawiające różne warunki i ich wpływ jak na powyższym.

create table t (x int, y int); 
insert into t values (null, null), (null, 1), (1, 1); 

select 'x = null' as test , x, y from t where x = null 
union all 
select 'x != null', x, y from t where x != null 
union all 
select 'not (x = null)', x, y from t where not (x = null) 
union all 
select 'x = y', x, y from t where x = y 
union all 
select 'not (x = y)', x, y from t where not (x = y); 

zwraca tylko 1 wiersz (zgodnie z oczekiwaniami):

TEST X Y 
x = y 1 1 

zobaczyć ten działa na SQLFiddle

+4

i jak działa 'null'. – joshua

+1

Nadal wiele problemów z tą odpowiedzią. "porównanie z wartością zerową jest zawsze uważane za fałszywe" - nie w sprawdzaniu ograniczeń, jak już wskazano, a nie w szczególnych przypadkach, np. 'NULL IS NULL' to porównanie, które oceni PRAWDA. "null" oznacza "nieznany" "- null jest symbolem zastępczym dla wartości, która powinna być obecna, ale z jakiegoś powodu jest obecnie brakująca i to aplikacja (nie wartość pusta) dostarcza znaczenia semantycznego (nieznane, nie dotyczy, świadek nie reagował, itp.). "jeśli null znajduje się na liście ..." Twój przykład wydaje się obejmować tabelę, a nie listę. – onedaywhen

+1

@początek, gdy myślałem, że jestem jasny ... przez "porównanie" mam na myśli '=' lub '! =' Etc, * not * 'IS NULL' lub' IS NOT NULL'. FYI wynik pojedynczego wyboru kolumn, taki jak użyty w 'IN (SELECT ...)', jest nazywany "listą" – Bohemian

4

Pierwszy jest prawidłowy sposób na sprawdzenie, czy wartość pola jest null natomiast później nie będzie działać tak, jak można oczekiwać, że ponieważ null jest szczególna wartość, która nie równa nic, więc nie można użyć porównania równości użyciu = dla to.

Więc kiedy trzeba sprawdzić, czy wartość pola jest null lub nie, użyj:

where x is null 

zamiast:

where x = null 
51

ważne jest, aby pamiętać, że NULL nie równa NULL.

NULL nie jest wartością, a zatem nie można jej porównać z inną wartością.

sprawdza, czy x jest wartością pustą.

where x = null sprawdza czy x jest równe NULL, który nigdy nie będzie prawdziwym

+1

Null jest wartością, jest to po prostu nieznana wartość. Podobnie jak w języku programowania zmienna może mieć wartość null. Ponadto możesz porównać, jeśli (varA! = Null). W sql jednak jest traktowany inaczej, jak wskazałeś. – broadband

+0

@broadband: null nie jest wartością, podobnie jak nieskończoność nie jest liczbą. Jest to jednak coś bardziej filozoficznego ... Tak, możesz przypisać "null" do zmiennej, ale to po prostu oznacza, że ​​jesteś niezrównoważony lub resetujesz tę zmienną. 0 lub "" byłoby wartością, ale wartość null oznacza "ta zmienna nie ma wartości". – Sygmoral

+0

@Sygmoral wewnętrznie, gdy piszesz C# string a = null, oznacza to, że ustawiasz wartość 'null' na zmienną' a'. Ale interpretacja dla programisty jest taka, jak powiedziałeś: "ta zmienna nie ma wartości". Więcej więcej w sql null może mieć wiele interpretacji lub logiki trójwartościowej. – broadband

3

myślę, że równość jest czymś, co może być absolutnie zdeterminowany. Problem z brakiem jest taki, że jest z natury nieznany. null w połączeniu z dowolną inną wartością jest null - unknown. Pytanie do SQL "Czy moja wartość jest równa zeru?" byłby nieznany za każdym razem, nawet jeśli dane wejściowe mają wartość zerową. Myślę, że wdrożenie IS NULL wyjaśnia.

Powiązane problemy