2011-06-09 142 views
0

如何將以下WHERE CASE語句更改爲bool以使語句正常工作?它給了我一個錯誤「在期望條件的上下文中指定的非布爾類型的表達式。」CASE語句布爾錯誤

WHERE (dma.DeviceId = @DeviceID AND dma.AssociationStart = @Start AND dma.AssociationEnd = @End) AND 
CASE WHEN (dma.AssociationEnd IS NOT NULL) 
    THEN (SELECT m.TimeStamp FROM Measurements m WHERE m.TimeStamp BETWEEN @Start AND @End) 
ELSE 
    (SELECT m.TimeStamp FROM Measurements m WHERE m.TimeStamp BETWEEN @Start AND (SELECT SYSDATETIMEOFFSET())) 
END 
+1

嘗試改變'(SELECT SYSDATETIMEOFFSET())'只是'SYSDATETIMEOFFSET() '。它可能不會直接解決你的問題,但它會讓你的代碼更好閱讀。 – 2011-06-09 16:02:44

+2

看到整個查詢,而不僅僅是'WHERE'子句對上下文有用。 – dnagirl 2011-06-09 16:05:25

+4

看起來你錯過了一個比較。在WHERE子句中,您需要將該CASE語句的結果與其他內容進行比較。 – 2011-06-09 16:06:11

回答

2

也許你打算做這樣的事情:

SELECT m.Timestamp FROM Measurements m 
WHERE dma.DeviceId = @DeviceID 
    AND dma.AssociationStart = @Start 
    AND dma.AssociationEnd = @End 
    AND m.Timestamp BETWEEN @Start AND COALESCE(@End, SYSDATETIMEOFFSET()) 

然而,即dma.AssociationEnd = @End成功已經的事實意味着,無論dma.AssociationEnd也不@End爲空。所以COALESCE(和原始問題中的整個CASE)是浪費時間。

(當然,這不僅使內具有dma較大SELECT感。)

+0

@ a1ex07:我現在已經完全重寫了這個查詢,所以甚至沒有'CASE'。 :-) – 2011-06-09 16:29:29

0

也許:

WHERE dma.DeviceId = @DeviceID 
    AND dma.AssociationStart = @Start 
    AND dma.AssociationEnd = @End 
    AND EXISTS 
    CASE WHEN (dma.AssociationEnd IS NOT NULL) 
     THEN (SELECT m.TimeStamp 
      FROM Measurements m 
      WHERE m.TimeStamp BETWEEN @Start AND @End 
      ) 
     ELSE (SELECT m.TimeStamp 
      FROM Measurements m 
      WHERE m.TimeStamp BETWEEN @Start AND SYSDATETIMEOFFSET() 
      ) 
    END 
+0

我調整了一下where語句,現在我可以選擇DeviceId,但是當它不想比較AssociationStart和@Start時。 – 2011-06-09 16:46:17

+0

WHERE dma.DeviceId = @DeviceID AND dma.AssociationStart> @啓動AND dma.AssociationEnd = @End \t AND(m.TimeStamp BETWEEN @啓動AND(CASE \t \t \t WHEN dma.AssociationEnd IS NULL THEN(SELECT SYSDATETIMEOFFSET( )) \t \t \t \t ELSE @End END)) – 2011-06-09 16:46:28