相反的情況下表達的,你可以簡單地使用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
因此,它無法有效地計劃索引查找或表掃描是否更有效。分離邏輯將允許爲每種情況使用最有效的計劃。
我不清楚@ENDE是一個變量還是一個打字錯誤 –
我甚至沒有注意到有兩個變量......我打算認爲這是一個錯字,但希望OP能澄清。 – GarethD
thx很多。這對我很好。現在我更瞭解它。 @ GarethD – Jens