簡體   English   中英

Case 語句中比較運算符的使用

[英]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 ,只需使用帶有ANDOR子句的正確 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的值為10時的查詢計划要求可能完全不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM