SQL 服务器中的 where if not null 条件
Conditions if not null in where in SQL Server
我需要从 table 中获取所有值,其中:
- 如果日期时间列 'start' 不为空且小于或等于现在。如果它是 null 我需要忽略开始验证。
- 如果日期时间列 'stop' 不为空且大于或等于现在。如果它是 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 但不与自身进行比较,是否有可能避免在 'where' 部分进行验证
条件可以这样写:
AND (table.validityStart IS NULL OR table.validityStart<=@currDate)
AND (table.validityStop IS NULL OR table.validityStop >=@currDate)
SQL 服务器不支持合并吗? (即选择第一个非空值。)
AND @currDate >= coalesce(table.validityStart, @currDate)
AND @currDate <= coalesce(table.validityStop, @currDate)
我需要从 table 中获取所有值,其中:
- 如果日期时间列 'start' 不为空且小于或等于现在。如果它是 null 我需要忽略开始验证。
- 如果日期时间列 'stop' 不为空且大于或等于现在。如果它是 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 但不与自身进行比较,是否有可能避免在 'where' 部分进行验证
条件可以这样写:
AND (table.validityStart IS NULL OR table.validityStart<=@currDate)
AND (table.validityStop IS NULL OR table.validityStop >=@currDate)
SQL 服务器不支持合并吗? (即选择第一个非空值。)
AND @currDate >= coalesce(table.validityStart, @currDate)
AND @currDate <= coalesce(table.validityStop, @currDate)