2010-02-24 125 views
4

我有一個執行查詢的SQL Server 2005存儲過程。該存儲過程需要三個參數。參數如下:SQL - 有條件的WHERE子句

@StateID如int,
@CountyID如int,
@CityID爲INT

這些參數用於查詢客戶的名單。如果參數值不爲空,我想基本上做一個「AND」。但是,我現在不能做一個if-else。如果參數值不爲null,如何添加這些子句。換句話說:

SELECT 
    * 
FROM 
    Customer c 
WHERE 
[email protected] 
-- AND [email protected] IF @CountyID IS NOT NULL 
-- AND [email protected] IF @CityID IS NOT NULL 

回答

12

夫婦的部分或聲明:

SELECT * 
FROM 
    Customer c 
WHERE 
    [email protected] 
    AND ([email protected] OR @CountyID IS NULL) 
    AND ([email protected] OR @CityID IS NULL) 

對於每一個這些參數的,如果是空,那麼檢查基本上是忽略不計。

+2

由於可控性,這將表現不佳。請參閱gbn的答案以尋求替代方案。 – 2010-02-24 21:52:02

+0

OMG Ponies - 是因爲Aaron在OR後有NULL檢查嗎? – stack 2010-02-25 20:22:20

+0

亞倫的回答,與gbn的不同,即使列CountyID本身可能包含NULL值,也可以工作。我需要類似於這個問題中的類似功能,但是我的列有一些NULL值;這個爲我工作。 – 2012-08-31 12:13:43

3
SELECT * 
FROM Customer c 
WHERE [email protected] 
AND c.CountyID= ISNULL(@CountyID, c.CountyID) 
AND c.CityID = ISNULL(@CityID, c.CityID) 
3
[email protected] 
AND 
c.CountyID = ISNULL(@CountyID, c.CountyID) 
... 

使用IF語句

或者

[email protected] 
AND 
@CountyID IS NULL OR c.CountyID = @CountyID) 
.... 

或動態SQL

左右所有其它問題問相同的搜索...

0

與聚結試試吧,我認爲這是一個非常優雅,乾淨的方法:

SELECT * 
FROM Customer c 
WHERE 
[email protected] 
AND c.CountyID = COALESCE(@CountyID, c.CountyID) 
AND c.CityID = COALESCE(@CityID, c.CityID) 

(請注意 - 這將過濾掉CountyID或CityID中的空值的記錄。)