2011-04-11 100 views
0

在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 != @idELSE

感謝您的幫助。

回答

1

假設id_a不能爲空

WHERE id_a = CASE 
       WHEN @id = 0 THEN CASE 
            WHEN id_a <> 0 THEN id_a 
            END 
       ELSE @id 
       END 

應該這樣做。除非您使用OPTION RECOMPILEare on specific versions of SQL Server 2008,否則這將是低效的。

1
--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) 
3

嘗試沿着這一線的東西:

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查詢,但是在一個變體返回大部分表的情況下它可能會更好地執行,但是第一個變體只返回單個行。

+1

@Martin謝謝 - 這將教我如何在沒有檢查的情況下發布代碼實際運行! – Justin 2011-04-11 11:05:06

+0

非常感謝Kragen您的「單線」解決方案對於我想要做的事情完美地工作,我沒有考慮它,但它終於簡單 – benj007 2011-04-11 13:39:26