比较运算符在 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
表达式,但请坚持使用AND
和OR
语句。
【参考方案1】:
如 cmets 中所述,不要在 WHERE
中使用 CASE
,只需使用带有 AND
和 OR
子句的适当布尔逻辑即可。在您的问题中,您的变量 @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
具有1
或0
的值时的查询计划要求可能完全不同。
【讨论】:
IF、UNION、AND/OR、OPTION RECOMPILE 等相对优点的很好参考:sommarskog.se/dyn-search.html 谢谢.. 我在使用 Case 时犯了一个错误,而它本应由 And OR 运算符轻松完成。我在这里严重犯了一个愚蠢的错误以上是关于比较运算符在 Case 语句中的使用的主要内容,如果未能解决你的问题,请参考以下文章
在“WHERE”中的“CASE”语句中的“THEN”之后使用“Between”运算符