条件,如果在SQL Server中的位置不为null

时间:2015-02-10 09:49:53

标签: sql sql-server sql-server-2008 where-clause

我需要从表格中获取所有值:

  • 如果datetime列'start'不为null且小于或等于now。如果它为null,我需要忽略启动验证。
  • 如果datetime列'stop'不为null且大于或等于now。如果它为null我需要忽略停止验证

所以我创建了这个请求

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)

因此,如果start或stop为null,则将当前日期时间与其自身进行比较。我不认为这是创建此请求的最佳方式。

如果值为null但没有将其与自身进行比较,那么是否有可能避免在'where'部分进行验证

2 个答案:

答案 0 :(得分:4)

您可以通过以下方式编写条件:

AND (table.validityStart IS NULL OR table.validityStart<=@currDate) 
AND (table.validityStop IS NULL OR table.validityStop >=@currDate)

答案 1 :(得分:0)

SQL Server支持不能合并吗? (即选择第一个非空值。)

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