【发布时间】:2012-04-28 11:06:02
【问题描述】:
让我们假设有一个具有 3 个参数的存储过程。在所有的可能性中,我希望通过一个 WHERE 子句来实现这一点,而不会因为过多地使用 () AND () OR () 而失控......
例子:
//Params
@CITY VARCHAR(100) = NULL,
@GENDER VARCHAR(100) = NULL,
@AGE VARCHAR(100) = NULL
我想你可以为每个变量使用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)
)
有没有更短更有效的方法来做到这一点?
如果是,该方法最好也与 JOIN 兼容。
【问题讨论】:
-
旁注:当定义
VARCHAR()- 作为存储过程或局部变量的参数时 - 应该总是有一个长度定义!否则你可能会无意中得到VARCHAR(1)字符串... -
可选字段,意思是如果没有或
NULL值,那么不要在Where子句中显示,可以吗?
标签: sql sql-server sql-server-2008