2011-09-05 191 views
1

我將有一個表跳過WHERE語句,如果該語句的變量爲空

TABLE1 
ID Name Country 
1 Anna Singapore 
2 Brad UK 
3 Cassie US 

declare @place varchar(20); 
set @place='US'; 

select * from Table1 where [email protected]; 

如果事情的價值是@place爲空???

然後,選擇不會選擇任何..

我要的是治療,因爲沒有地方爲國家發言。而如果有其他地方的發言,他們將工作..

任何想法如何做到這一點?

回答

3

對於您的問題,這個簡單的情況下,只需要使用

IF (@place IS NULL) 
    SELECT * 
    FROM table1 
ELSE 
    SELECT * 
    FROM table1 
    WHERE country = @place 

如果您的實際情況比較複雜,你可以使用

select * 
from Table1 
where @place is null or [email protected] 
option (recompile) 

原因需要在recompile提示是爲了避免具有單計劃迎合這兩種情況,並在您提供明確價值的情況下進行不必要的掃描。

這些,和其他替代品,如動態生成的查詢,進行了詳細的文章Dynamic Search Conditions in T-SQL

+0

哦..調理變量是唯一的方法??因爲..我想要添加一個if條件語句coz ..下面的代碼太複雜,不能添加額外的語句..任何其他方式? – william

+0

我的答案中沒有「If」條件語句。 –

+0

我的意思是在鏈接..你提供...在鏈接裏面,有2個版本。舊版本正在檢查if語句。最新的一個是'%'.. – william

1

like=,因爲你是在處理文本是在您的情況當量(CHAR,NCHAR,VARCHAR,nvarchar的討論)值。取而代之的

WHERE country = @place 

嘗試

WHERE country like @place 

對於變量集嘗試 而不是

set @place='US' 

嘗試

set @country = isnull('''US''','''%''') 

爲了測試這個:

declare @country nvarchar(50) 
set @country = isnull('''US''','''%''') 
print @Country 
set @country = isnull(NULL,'''%''') 
print @Country 

額外的引號是必要的,因爲在你的例子中,你正在使用明確的價值觀 - '是一個轉義字符,你需要周圍的每個值一個單引號來表示它不是一個表柱。如果您使用COLUMN_NAME,則只需在%字符周圍使用單引號。

根據您的SQL版本,您可能需要使用不同的通配符。 這是一個相當直接和線性的解決方案,雖然存在與開放變量相關的風險。