2015-02-10 50 views
0

我需要从工作台上得到的所有值不为空:条件。如果在SQL Server中

  • 如果datetime列“开始”不为空到小于或等于现在。如果它为空,我需要忽略开始验证。
  • 如果日期时间列'停止'不为空并且大于或等于现在。如果是空我需要忽略停止验证

所以我创造了这个请求

DECLARE @currDate DATETIME; 
SET @currDate = GETDATE(); 

SELECT * 
FROM table 
WHERE 
    -- here I have some other conditions 
    AND @currDate >= (CASE WHEN table.validityStart IS NOT NULL THEN table.validityStart ELSE @currDate END) 
    AND @currDate <= (CASE WHEN table.validityStop IS NOT NULL THEN table.validityStop ELSE @currDate END) 

所以,如果停止或开始为null我比较当前日期时间与自身。我不认为这是创建此请求的最佳方式。

那么,有没有可能避免“其中”部分验证,如果值为空,但不是它本身比较

回答

4

你可以写在下面的方式条件:

AND (table.validityStart IS NULL OR table.validityStart<[email protected]) 
AND (table.validityStop IS NULL OR table.validityStop >[email protected]) 
0

隐而不宣” t SQL Server支持合并? (即选取第一个非空值)。

AND @currDate >= coalesce(table.validityStart, @currDate) 
AND @currDate <= coalesce(table.validityStop, @currDate) 
+0

是的,这是可能的解决方案,但这里不是SARG。 – 2015-02-10 10:14:13

+0

st mnmn的回答比较好。 (Upvoted!) – jarlh 2015-02-10 10:16:05