2011-09-06 196 views
2

我試圖在一年的時間段內對一個數據塊進行子集劃分。有兩個日期字段可用於子集。首先,我應該使用DATE1在我的where子句中使用。如果這是NULL,那麼我需要使用DATE2。如果兩者都是NULL,那麼顯然他們不符合條件。SQL條件WHERE子句CASE WHEN

注意:我不是SQL Server專家。我只是使用Ent。經理獲得一些查詢結果。我通常在SAS編程和很舒服TSQL,但我不知道這一切來與SQL Server 2008中

SELECT count(CASE WHEN msg_fmt = 'ABC' then 1 END) as GRP1_CNT, 
     count(CASE WHEN msg_fmt = 'LMN' then 1 END) as GRP2_CNT, 
     count(CASE WHEN msg_fmt = 'XYZ' then 1 END) as GRP3_CNT, 
FROM msg_repository 
WHERE (CASE WHEN DATE1 IS NOT NULL then 
    DATE1 between '2010-01-01' and '2011-01-01' 
    ELSE DATE2 between '2010-01-01' and '2011-01-01' 
    END) 
GROUP BY msg_fmt 

所以,如果DATE1不爲空的招數,使用日期。如果它是NULL,則使用DATE2。我寧願有一個只使用T-SQL的解決方案,因爲該解決方案也可以用於SAS。但是,我現在會採取任何措施。

感謝您的任何幫助。

+0

是'DATE1'和類型的''DATE2' DATE','DATETIME',...?使用'> ='20100101'和<'20110101'比'BETWEEN'更安全。 –

回答

5

你可以使用​​3210:

where coalesce(date1,date2) between '2010-01-01' and '2011-01-01' 
+0

+1比我最初想到的要乾淨得多。 –

+0

謝謝Andomar。這正是我需要的。 –

2

如果你只是處理兩個值,那麼ISNULL(適合2倍的值)會工作。

如果您使用的是日期時間數據類型,那麼請注意,像「2011-01-01」這樣的值不包括該日期的任何時間(小時/分鐘/秒/納秒)。換句話說,'2011-01-01'上午8點是大於'2011-01-01'。

總之,這裏的ISNULL的一個例子:

ISNULL(date1, date2) between '2010-01-01' and '2011-01-01'