比较运算符在 Case 语句中的使用

Posted

技术标签:

【中文标题】比较运算符在 Case 语句中的使用【英文标题】:Comparison operator use in Case statement 【发布时间】:2021-11-21 03:37:41 【问题描述】:

当我尝试在 SQL Server 中使用以下查询时,我遇到了一些语法问题。我想根据条件显示WHERE 子句。

这是我的代码:

DECLARE @isActual = 0

SELECT
    SolverRunId, PointId, TimeStampUtc, Value,
    UnitOfMeasure, Reliability
FROM
    (SELECT 
         bt.SolverRunId, bt.PointId, bt.TimeStampUtc,
         bt.Value, bt.UnitOfMeasure, bt.Reliability
     FROM 
         cte bt
     WHERE 
         bt.TimeStampUtc = bt.TargetTimeUtc

     UNION ALL

     SELECT 
         a.SolverRunId, a.PointId, a.TimeStampUtc, a.Value,
         a.UnitOfMeasure, a.Reliability
     FROM 
         cte a
     WHERE 
         -- I tried using this case but it is syntactically incorrect
         CASE 
             WHEN @isActual = 0 THEN a.TimeStamUtc > @endDateUtc 
             ELSE a.TimestampUtc <= @endDateUtc 
         END
         -- instead of this. I wanted to have conditional where based on @isActual value from 0 to 1
         a.TimeStampUtc > @endDateUtc
         AND a.SolverRunId = @maxRun) x
ORDER BY 
    SolverRunId, PointId, TimeStampUtc;

我希望将基于 @isActual 评估的 where 条件设置为 true 或 false

【问题讨论】:

1) 这是一个case 表达式 2) 在 WHERE 子句中最好使用常规的 AND/OR 结构而不是大小写。 CASE 返回一个 标量 值,而不是布尔结果。尽管无论如何都不要在WHERE 中使用CASE 表达式,但请坚持使用ANDOR 语句。 【参考方案1】:

如 cmets 中所述,不要在 WHERE 中使用 CASE,只需使用带有 ANDOR 子句的适当布尔逻辑即可。在您的问题中,您的变量 @isActual 也缺少数据类型,所以我 假设它是 bit

DECLARE @isActual bit = 0;
SELECT SolverRunId,
       PointId,
       TimeStampUtc,
       Value,
       UnitOfMeasure,
       Reliability
FROM (SELECT bt.SolverRunId,
             bt.PointId,
             bt.TimeStampUtc,
             bt.Value,
             bt.UnitOfMeasure,
             bt.Reliability
      FROM cte bt
      WHERE bt.TimeStampUtc = bt.TargetTimeUtc
      UNION ALL
      SELECT a.SolverRunId,
             a.PointId,
             a.TimeStampUtc,
             a.Value,
             a.UnitOfMeasure,
             a.Reliability
      FROM cte a
      WHERE a.TimeStampUtc > @endDateUtc
        AND a.SolverRunId = @maxRun
        AND ((@isActual = 0 AND a.TimeStamUtc > @endDateUtc)
          OR (@isActual = 1 AND a.TimestampUtc <= @endDateUtc))) x
ORDER BY SolverRunId,
         PointId,
         TimeStampUtc;

您可能还想尝试将RECOMPILE 添加到上面的OPTION 子句中,因为当@isActual 具有10 的值时的查询计划要求可能完全不同。

【讨论】:

IF、UNION、AND/OR、OPTION RECOMPILE 等相对优点的很好参考:sommarskog.se/dyn-search.html 谢谢.. 我在使用 Case 时犯了一个错误,而它本应由 And OR 运算符轻松完成。我在这里严重犯了一个愚蠢的错误

以上是关于比较运算符在 Case 语句中的使用的主要内容,如果未能解决你的问题,请参考以下文章

表达式和语句

switch用法

在“WHERE”中的“CASE”语句中的“THEN”之后使用“Between”运算符

python中的条件语句,分支语句以及逻辑运算符和比较运算符

[JAVA] 2. Java中的控制流

C-switch语句, 逻辑运算符, 三元运算符, 指针与函数