2016-04-15 72 views
-1

如何在結果中包含或排除數據。Where子句有無變量數據

我有一個表中有許多值在一行。我想顯示所有的值「結束」或所有值沒有「結束」。我的開關「@end」也有一個變量。

如果它的值爲「310」,則程序應該向我顯示所有的「結束」。如果它具有另一個值,程序應該顯示我沒有「結束」。

我想是這樣的:

where CASE @END WHEN 310 THEN m.LONR = @ENDE ELSE m.LONR <> 310 END 

看來運營商都不可能在與case子句。

我還沒有找到任何相應的答案,或者我不明白。

感謝延

回答

1

相反的情況下表達的,你可以簡單地使用OR

WHERE (@End = 310 AND m.LONR = 310) 
OR  (@End <> 310 AND m.LONR <> 310) 

值得注意的是,無論是斷言將評估爲true NULL值的情況下,因此,如果任變量或列可爲空,你不妨使用:

WHERE (@End = 310 AND m.LONR = 310) 
OR  (ISNULL(@End, 0) <> 310 AND ISNULL(m.LONR, 0) <> 310); 

如果m.LONR是indexe d,那就幾乎可以肯定是有益的使用或者IF分裂的情況下向上:

IF (@End = 310) 
BEGIN 
    SELECT <columns> 
    FROM <tables> 
    WHERE m.LONR = 310; 
END 
ELSE 
BEGIN 
    SELECT <columns> 
    FROM <tables> 
    WHERE m.LONR <> 310; 
END 

或者使用UNION ALL

SELECT <columns> 
FROM <tables> 
WHERE m.LONR = 310 
AND  @End = 310; 
UNION ALL 
SELECT <columns> 
FROM <tables> 
WHERE m.LONR <> 310 
AND  @End <> 310; --OR ISNULL(@End, 0) <> 310 to deal with NULLs 

這樣做的原因是,SQL Server將創建一個計劃基於@End因此在編輯時不知道它是否會按照以下方式過濾:

m.LONR = 310 

m.LONR <> 310 

因此,它無法有效地計劃索引查找或表掃描是否更有效。分離邏輯將允許爲每種情況使用最有效的計劃。

+1

我不清楚@ENDE是一個變量還是一個打字錯誤 –

+0

我甚至沒有注意到有兩個變量......我打算認爲這是一個錯字,但希望OP能澄清。 – GarethD

+0

thx很多。這對我很好。現在我更瞭解它。 @ GarethD – Jens