[英]Comparison operator use in Case statement
當我嘗試在 SQL 服務器中使用以下查詢時,語法出現了一些問題。 我想根據條件顯示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
設置為 true 或 false 來評估 where 條件
正如評論中提到的,不要在WHERE
中使用CASE
,只需使用帶有AND
和OR
子句的正確 boolean 邏輯。 在您的問題中,您的變量@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
時的查詢計划要求可能完全不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.