2010-02-24 123 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中的空值的记录。)