在SQL Server查詢我想有一個條件WHERE
條款是這樣的:條件在WHERE子句中TSQL,運營商的問題
WHERE id_A = CASE WHEN @id != 0 THEN @id ELSE anything but @id END
我不知道該怎麼寫ELSE
部分。在一種情況下,我需要WHERE id_A = @id
,但 WHERE id_A != @id
爲ELSE
。
感謝您的幫助。
在SQL Server查詢我想有一個條件WHERE
條款是這樣的:條件在WHERE子句中TSQL,運營商的問題
WHERE id_A = CASE WHEN @id != 0 THEN @id ELSE anything but @id END
我不知道該怎麼寫ELSE
部分。在一種情況下,我需要WHERE id_A = @id
,但 WHERE id_A != @id
爲ELSE
。
感謝您的幫助。
假設id_a
不能爲空
WHERE id_a = CASE
WHEN @id = 0 THEN CASE
WHEN id_a <> 0 THEN id_a
END
ELSE @id
END
應該這樣做。除非您使用OPTION RECOMPILE
和are on specific versions of SQL Server 2008,否則這將是低效的。
--will match always (if id_A can not be NULL
WHERE
id_A = CASE WHEN @id <> 0 THEN @id ELSE id_A END
-- will be false always
WHERE
id_A = CASE WHEN @id <> 0 THEN @id ELSE NULL END
這些可以寫成
WHERE
id_A = ISNULL(NULLIF(@id, 0), id_A)
WHERE
id_A = NULLIF(@id, 0)
嘗試沿着這一線的東西:
WHERE (@id != 0 AND id_A = @id) OR (@id = 0 AND id_A != @id)
注意,如果查詢可能返回顯著不同的行數,那麼你應該而應考慮將其分爲兩個查詢,以確保您對這兩個查詢都有最佳查詢計劃,這些查詢計劃如下:
IF @id != 0 THEN
BEGIN
SELECT /* columns from table */
WHERE id_A = @id
END
ELSE
BEGIN
SELECT /* columns from table */
WHERE id_A != 0
END
不幸的是,這意味着複製了其餘的SQL查詢,但是在一個變體返回大部分表的情況下它可能會更好地執行,但是第一個變體只返回單個行。
@Martin謝謝 - 這將教我如何在沒有檢查的情況下發布代碼實際運行! – Justin 2011-04-11 11:05:06
非常感謝Kragen您的「單線」解決方案對於我想要做的事情完美地工作,我沒有考慮它,但它終於簡單 – benj007 2011-04-11 13:39:26