【问题标题】:SQL Server 2008 - boolean variable change querySQL Server 2008 - 布尔变量更改查询
【发布时间】:2009-09-20 10:17:16
【问题描述】:

我有以下疑问:

DECLARE @IsStocked bit
SELECT * FROM Products p WHERE p.LastSeen >  GETDATE() - 30 

这将返回过去 30 天内看到的所有 产品

我的问题是,我希望 p.LastSeen > GETDATE() - 30 子句仅在 @IsStocked = true 时适用。

这是一个更大查询的一部分,我想在不使用 IF/ELSE 语句的情况下实现这一点(即,如果 WHERE 子句的 @IsStocked = false p.LastSeen > GETDATE() - 30 部分被完全忽略)。

谢谢!

【问题讨论】:

  • 为什么不使用 IF/ELSE?另一种选择可能会导致不正确的缓存查询计划....
  • 真正简单起见 - 存储过程中大约有 10 个变量 - 所有这些变量都可以是真/假或空 - 除非有一种方法可以建议不会导致 IF/ELSE每个?谢谢!

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


【解决方案1】:
DECLARE @IsStocked bit

SELECT * FROM Products p
WHERE  @IsStocked = 0 OR (p.LastSeen > GETDATE() - 30);

【讨论】:

    【解决方案2】:
    DECLARE @IsStocked bit;
    
    SELECT * 
    FROM Products p
    WHERE (@IsStocked = 1 AND p.LastSeen > GETDATE() - 30) 
    OR     @IsStocked = 0;
    

    【讨论】:

    • @Mitch:现在是早上 6:30,我无法再次入睡。让我休息一下,伙计! ;-)
    【解决方案3】:

    根据您的问题,这是我的查询

    DECLARE @IsStocked bit
    Set @IsStocked=1
    Select * from Product
    Where LastSeen  = Case When (@IsStocked=1) THEN GETDATE() - 30 
                       Else LastSeen  END
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多