2012-05-11 111 views
5

目前,我有一個存儲過程,它需要一個字符串速記IF語句在SQL

@vari as varchar(30) 
if @vari is null 
    SELECT * FROM TABLE 
else 
    SELECT * FROM TABLE WHERE col = @vari 
endif 

有什麼辦法內聯的if語句,因此不會宣佈2選擇只是因爲1個PARAM的?

+0

你也可以用case語句做到這一點,它不是短以下,但在某些情況下,它是更好的答案。 – Purplegoldfish

+0

我不會改變你的代碼,因爲在大多數情況下,sql會比'或'條件產生更好的執行計劃。 –

回答

15
SELECT * FROM TABLE WHERE (@vari is null or col = @vari) 
+0

這可行,但我的下一個問題:爲什麼?括號中是否只將第一個標準評估爲真,然後停止或...? – Alex

+3

@Alex:它仍然評估這兩個標準,但是由於'或',任何一個對於包含在結果集中的行都可以是真實的。如果'@vari爲null',那麼每一行都會被返回,因爲第一部分總是爲真。否則,返回的唯一行將是與第二部分「col = @ vari」匹配的那些行,它將應用過濾器。 – mellamokb

+2

括號在這裏,因爲我有習慣把OR放在括號裏。 –

3

假設col是從來沒有空,你可以這樣做:

select * 
from table 
where col = isnull(@vari, col)