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
[logika trójwartościowa] (http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -logic /) –
Pomyśl o 'NULL' jako' Unknown Yet Value'. Co powinno dać '@Date = Unknown Yet Value'? 'True'? 'Fałsz"? Lub "Nie wiemy"? –