2010-03-16 7 views
25

Moja tabela źródłowa wygląda następującosprawdź datę zerową w instrukcji CASE, gdzie się nie udało?

Id  StartDate 
1  (null) 
2  12/12/2009 
3  10/10/2009 

Chcę stworzyć select, że wybiera powyżej, ale ma także dodatkową kolumnę, aby wyświetlić varchar jeżeli data nie jest null, takie jak:

Id  StartDate StartDateStatus 
1  (null)  Awaiting 
2  12/12/2009 Approved 
3  10/10/2009 Approved 

Mam następujące w moim wybierz, ale wydaje się nie działa. Wszystkie stany są ustawione na Approved chociaż terminy mają pewne wartości Null

 select 
      id, 
      StartDate, 
     CASE StartDate 
     WHEN null THEN 'Awaiting' 
     ELSE 'Approved' END AS StartDateStatus 
     FROM myTable 

Wyniki mojego zapytania wyglądać następująco:

Id  StartDate StartDateStatus 
1  (null)  Approved 
2  12/12/2009 Approved 
3  10/10/2009 Approved 
4  (null)  Approved 
5  (null)  Approved 

StartDate jest smalldatetime, jest jakiś wyjątek, jak to powinno być traktowanym?

Dzięki

Odpowiedz

58

Spróbuj:

select 
    id, 
    StartDate, 
CASE WHEN StartDate IS NULL 
    THEN 'Awaiting' 
    ELSE 'Approved' END AS StartDateStatus 
FROM myTable 

kod byłby robi Kiedy StartDate = NULL, myślę.


NULL nigdy nie jest równe NULL (NULL jest brak wartości). NULL również nigdy nie jest równy NULL. Powyższa składnia jest standardem ANSI SQL, a odwrotnie: StartDate IS NOT NULL.

można uruchomić następujące:

SELECT CASE WHEN (NULL = NULL) THEN 1 ELSE 0 END AS EqualityCheck, 
CASE WHEN (NULL <> NULL) THEN 1 ELSE 0 END AS InEqualityCheck, 
CASE WHEN (NULL IS NULL) THEN 1 ELSE 0 END AS NullComparison 

I to wraca:

EqualityCheck = 0 
InEqualityCheck = 0 
NullComparison = 1 

Dla kompletności, w SQL Server można:

SET ANSI_NULLS OFF; 

co spowodowałoby w równych porównaniach działa różny ntly:

SET ANSI_NULLS OFF 

SELECT CASE WHEN (NULL = NULL) THEN 1 ELSE 0 END AS EqualityCheck, 
CASE WHEN (NULL <> NULL) THEN 1 ELSE 0 END AS InEqualityCheck, 
CASE WHEN (NULL IS NULL) THEN 1 ELSE 0 END AS NullComparison 

Które zwraca:

EqualityCheck = 1 
InEqualityCheck = 0 
NullComparison = 1 

Ale gorąco odradzam ten sposób. Ludzie następnie utrzymując swój kod może być zmuszany do polowania na dół i cię zranić ...

Ponadto, nie będzie już pracować w nadchodzących wersjach serwera SQL:

https://msdn.microsoft.com/en-GB/library/ms188048.aspx

+0

dlaczego "ColumnName = NULL" nie działa? Dlaczego taka składnia nie jest akceptowana? –

3
select Id, StartDate, 
Case IsNull (StartDate , '01/01/1800') 
When '01/01/1800' then 
    'Awaiting' 
Else 
    'Approved' 
END AS StartDateStatus 
From MyTable 
+0

Jeśli StartDate = '01/01/1800 ', wynik będzie "Oczekuje". – Xordal

Powiązane problemy