sql条件WHERE子句CASE WHEN

时间:2011-09-06 17:37:21

标签: sql tsql sql-server-2008

我正在尝试将一段数据分配一年的时间段。我可以使用两个日期字段进行子集化。首先,我应该在我的where子句中使用DATE1。如果是NULL,那么我需要使用DATE2。如果两者都是NULL,那么显然它们不符合条件。

注意:我不是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,请使用该日期。如果为NULL,请使用DATE2。我更希望有一个只使用T-SQL的解决方案,因为该解决方案也可以在SAS中使用。但是,我现在会采取任何措施。

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

您可以使用coalesce

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

答案 1 :(得分: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'
相关问题