2010-10-06 1 views
5

Teraz wiem, że nie można bezpośrednio porównać NULL do niczego (jak null jest nieznany), tak jak by to osiągnąć następujące:Porównaj gdy wartość może być zarówno NULL lub tekst

select * 
    from Material as m 
    where MtrlCode = 826 and 
      Exposlimit <> 'compareMe' 

Gdzie Exposlimit MOŻE być NULL lub może nie być. "compareMe" może również mieć wartość NULL.

W związku z tym, w jaki sposób porównać te dwa? Obie strony mogą być tekstem lub NULL.

Odpowiedz

5
select * 
from Material as m 
where MtrlCode = 826 
    and (Exposlimit <> 'compareMe' 
     or (Exposlimit is null and compareme is not null) 
     or (Exposlimi is not null and compareme is null)) 
+0

Działa pięknie, bardzo dziękuję. –

1
select * 
    from Material as m 
    where (MtrlCode = 826 or MtrlCode IS NULL) and 
      (Exposlimit <> 'compareMe' or Exposlimit IS NULL) 
2

W takich przypadkach należy użyć funkcji IFNULL.

tj

GDZIE IFNULL (FieldA 'MagicConstant') = IFNULL (FieldB 'MagicConstant')

+0

Czy IFNULL istnieje w T-SQL? Nawet jeśli użyjesz ISNULL, optymalizator będzie miał trudności z użyciem dowolnych indeksów, które mógłbyś zdefiniować. –

+0

@Paul, yes sql-server nie ma indeksów opartych na funkcjach, a obejście (http://www.sqlservercentral.com/scripts/T-SQL+Aids/31906/) wygląda bardzo brzydko. –

0

Próbowałeś tego?

select * 
    from Material as m 
    where MtrlCode = 826 and 
      Exposlimit IS NOT NULL AND 'compareMe' IS NOT NULL AND Exposlimit <> 'compareMe' 
0

Uważają, że łatwiej jest znaleźć równości:

(Column = @Value or (Column is null and @Value is null)) 

co powoduje prawdziwe, gdy obie wartości są równe. Chcielibyśmy idealnie móc negować tego oświadczenia znaleźć nierówności, ale logika tri-state SQL łamie ten pomysł, jako NOT(UNKNOWN) = UNKNOWN

--DO NOT USE, broken 
NOT (Column = @Value or (Column is null and @Value is null)) 

Jeśli więc sprawdzić tylko wartość TRUE i neguje go, wciąż otrzymujemy operację czytelną.

CASE WHEN Column is null and @Value is null or Column = @Value THEN 1 ELSE 0 END = 0