WHERE子句中的可选参数

Con*_*eak 23 sql sql-server sql-server-2008

让我们假设有一个存储过程有3个参数.在所有的可能性中,我希望用一个单独的WHERE条款实现这一点,而不会因为使用() AND () OR ()太多而失去控制......

例:

    //Params
@CITY VARCHAR(100) = NULL,
@GENDER VARCHAR(100) = NULL,
@AGE VARCHAR(100) = NULL
Run Code Online (Sandbox Code Playgroud)

我想你可以使用IF BEGIN ... END每个变量如果存在,但这使得代码比期望的更长.

下面这个方法不会起作用,因为它的方式太长了(这个大约有10个不同的字段,但是这个例子只有3个.)而且我不确定它是否甚至直接提取了不同的值......

SELECT NAME FROM TABLE 
WHERE (
(CITY=@CITY AND GENDER=@GENDER AND AGE=@AGE)
OR (CITY=@CITY AND GENDER=@GENDER)
OR (GENDER=@GENDER AND AGE=@AGE)
OR (CITY=@CITY AND AGE=@AGE)
OR (CITY=@CITY)
OR (GENDER=@GENDER)
OR (AGE=@AGE)
)
Run Code Online (Sandbox Code Playgroud)

有没有更短的更有效的方法来做到这一点?

如果是,则该方法最好也与JOIN兼容.

cjk*_*cjk 53

除了ISNULL/ COALESCEoptions之外,您可以测试参数为null:

SELECT NAME  
FROM TABLE  
WHERE  
    (@City IS NULL OR City = @City)
AND 
    (@Gender IS NULL OR Gender = @Gender)
AND 
    (@Age IS NULL OR Age = @Age) 
Run Code Online (Sandbox Code Playgroud)

  • 我知道评论有点太晚了,但请注意这种方法,因为SQL Server不保证评估的顺序(它不会确定是否会发生短路).所以你最好还是让SQL Server做所有不必要的检查. (5认同)
  • @IlyaChernomordik:冲下山坡的表现。 (3认同)

sil*_*lly 12

那这个呢?

SELECT
    NAME
FROM TABLE 
WHERE CITY = COALESCE(@CITY, CITY)
    AND GENDER = COALESCE(@GENDER, GENDER)
    AND AGE = COALESCE(@AGE, AGE)
Run Code Online (Sandbox Code Playgroud)

  • 美丽!希望SQL Server能够在遇到空变量时优化条件.测试会很有趣. (2认同)

Gre*_*reg 6

尝试这样的事情:

SELECT NAME 
FROM TABLE 
WHERE 
    City = IsNull(@City, City) AND
    Gender = IsNull(@Gender, Gender) AND
    Age = IsNull(@Age, Age)
Run Code Online (Sandbox Code Playgroud)

或者:

SELECT NAME 
FROM TABLE 
WHERE 
    (City = @City OR @City IS NULL) AND
    (Gender = @Gender OR @Gender IS NULL) AND
    (Age = @Age OR @Age IS NULL)
Run Code Online (Sandbox Code Playgroud)