2010-03-16 13 views
25

Kaynağım tablo gibi görünen buCASE bildiriminde boş tarih olup olmadığını kontrol edin, nerede hata yaptım?

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

tarih gibi boş değilse yukarıdaki seçen bir seçme deyimini, oluşturmak istediğiniz değil, aynı zamanda bir varchar görüntülemek için ek bir sütun vardır:

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

Seçimde var, ancak çalışmıyor gibi görünüyor. tarih bazı nulls benim sorgu

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

sonuç benziyor olmasına rağmen durumların tamamı Approved ayarlanır:

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

BaşlangıçTarihi bir smalldatetime olduğunu, bu nasıl olması gerektiği için bazı istisna vardır Davranılmak?

Teşekkür

cevap

58

Dene: Bence zaman BaşlangıçTarihi = NULL

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

Kodun bir yapıyor olurdu. (NULL bir değer olmaması gibi)


NULLNULL asla eşittir. NULL da asla NULL'a eşit değildir. Yukarıda belirtilen sözdizimi ANSI SQL standardıdır ve görüşme StartDate IS NOT NULL olur.

Aşağıdaki çalıştırabilirsiniz:

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 

Ve bu döndürür:

SET ANSI_NULLS OFF; 

neden olur: yapabilirsiniz SQL Server, tamlığı için

EqualityCheck = 0 
InEqualityCheck = 0 
NullComparison = 1 

senin eşittir karşılaştırmalar çalışma farklı ntly:

EqualityCheck = 1 
InEqualityCheck = 0 
NullComparison = 1 

Ama ben çok bunu karşı öneriyoruz:

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 

döndürür hangisi.

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

+0

neden: sonradan kodunuzu korumak İnsanlar

Ayrıca

, artık SQL server yaklaşan sürümlerinde çalışacak ... aşağı avı ve size zarar mecbur olabilir "ColumnName = NULL" çalışmıyor? Neden böyle bir sözdizimi kabul edilmiyor? –

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

StartDate = '01/01/1800 'ise, sonuç' Bekleniyor 'olacaktır. – Xordal

İlgili konular