2012-01-25 12 views
5

Po prostu natknąłem się na interesujący problem z procedurą, którą piszę w SQL.Dlaczego porównywanie zmiennej daty SQL z wartością null zachowuje się w ten sposób?

W moim proc mam 2 daty, które są opcjonalnymi parametrami domyślnie NULL, chcę sprawdzić, czy te parametry nie są zerowe i jeśli nie działają część mojego proc, jeśli są one zerowe to dodatkowa część proc jest ignorowany.

Zrobiłem dość podstawowe oświadczenie IF(@dateVariable <> NULL AND @DateVariable2 <> NULL), ale instrukcja if nigdy nie zadziała, nawet jeśli zmienne nie mają wartości null, zakładam, że SQL ma problem z porównaniem daty z wartością NULL, co jest dziwne, ponieważ datetime jest null.

Aby obejść ten problem, właśnie wykonałem IF(DateVariable IS NOT NULL), który działa poprawnie. Próbowałem też IF(ISNULL(@DateVariable,'') <> ''), który również działa poprawnie

Moje pytanie brzmi: dlaczego pierwszy IF nie działa, ale drugi i trzeci IF oba mają miejsce, ponieważ oba muszą w pewnym momencie porównać zawartość zmiennej do wartości zerowej?

Przykład:

----- zawodzi -----

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date <> NULL) 
BEGIN 
    print('a') 
END 

----- Works -----

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (ISNULL(@Date,'') <> '') 
BEGIN 
    print('a') 
END 

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date IS NOT NULL) 
BEGIN 
    print('a') 
END 
+3

[logika trójwartościowa] (http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -logic /) –

+0

Pomyśl o 'NULL' jako' Unknown Yet Value'. Co powinno dać '@Date = Unknown Yet Value'? 'True'? 'Fałsz"? Lub "Nie wiemy"? –

Odpowiedz

13

Mówiąc „NULL "nie równa się" NULL ". "NULL" jest porównywalne do stanu niepewności, gdzie jedna rzecz jest niepewna niekoniecznie jest równa coś innego, co również jest niepewne. Użyj "IS NULL", "ISNULL()" lub "COALESCE()" podczas testowania wartości zerowych. Ustawienie ANSI_NULLS na "off" może zmienić to zachowanie, ale nie jest to standard ANSI SQL. Aby uzyskać więcej informacji, patrz http://msdn.microsoft.com/en-us/library/ms191270.aspx.

4

Należy zachować ostrożność przy porównywaniu wartości pustych. Zachowanie porównania zależy od ustawienia opcji SET ANSI_NULLS.

Po ustawieniu opcji ANSI_NULLS na wartość ON, porównanie, w którym jedno lub więcej spośród wyrażeń ma wartość NULL, nie daje wartości PRAWDA ani FAŁSZ; przynosi NIEZNANY. Wynika to z faktu, że nieznana wartość nie może być porównywana logicznie z żadną inną wartością. Dzieje się tak, jeśli porównano wyrażenie z literałem NULL, lub jeśli dwa wyrażenia są porównywane , a jeden z nich jest oceniany jako NULL.

Patrz NULL Comparison Search Conditions

+2

'SET ANSI_NULLS OFF' jest przestarzałe. http://msdn.microsoft.com/en-us/library/ms143729.aspx –

Powiązane problemy