2012-02-21 44 views
0

我有一个数据结果,我想过滤两个不同的日期。SQL检查空日期和大小写切换

除了当completion_date为空时,以下方法正在工作。如果它为空,我想使用一个名为created_date的不同字段。

string strSQL = string.Format(@"select * from my_table 

      where user_Id = {0} 

      AND [completion_date] between {1} AND {2} 

      order by completion_status desc, [completion_date] asc" 
      , userId, dateStart, dateEnd, visibilityIndicator); 

也许是这样的:

string strSQL = string.Format(@"select * from my_table             
where user_Id = {0} 


CASE completion_date 
    WHEN is null THEN [completion_date] between {1} AND {2} 
    ELSE [created_date] between {1} AND {2} 

END 

AND      
      order by completion_status desc, [completion_date] asc" 
      , userId, dateStart, dateEnd, visibilityIndicator); 

什么是检查为空值的最佳方式,然后切换到CREATED_DATE?

回答

3
where isnull(completetion_date,created_date) between {1} and {2} 

应该工作

+0

感谢那些确实做的伎俩。 :) – User970008 2012-02-22 01:29:27

0
string strSQL = string.Format(@"select * from my_table 
where user_Id = {0} 
AND ISNULL([completion_date],[created_date]) between {1} AND {2} 
order by completion_status desc, [completion_date] asc" 
0

的ANSI SQL兼容的版本:

SELECT * FROM my_table WHERE user_Id = {0} 
AND [completion_date] BETWEEN {1} AND {2} 
OR ([completion_date] IS NULL AND [created_date] BETWEEN {1} AND {2}) 
ORDER BY completion_status DESC, [completion_date] ASC 
+0

也有ANSI'COALESCE',但不知道它是否适用于此...也许。 – 2012-02-21 22:07:24

+0

谢谢!有趣的解决方案。如果可能的话,我尽量避免合并,只是作为个人偏好。 – User970008 2012-02-22 01:30:51