Sql 如何添加条件语句来测试存储过程中动态where子句中的特定值

Sql 如何添加条件语句来测试存储过程中动态where子句中的特定值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个存储过程,向其中传递了许多变量,并使用“and(@var为NULL或table.field=@var)”创建了一个动态where子句,它非常有效。。。除了 其中一个变量(@statusLevel)可以是1-9或10。当传入的值为10时,我只想返回那些statusLevel=10的项目。当传入的值介于1和9之间时,我希望返回该值(比如“5”)和小于10之间的所有项目 我让每个部分都能完美地独立工作,但我不知道如何让它们一起工作 AND ((@statusLevelID IS NULL OR

我有一个存储过程,向其中传递了许多变量,并使用“and(@var为NULL或table.field=@var)”创建了一个动态where子句,它非常有效。。。除了

其中一个变量(@statusLevel)可以是1-9或10。当传入的值为10时,我只想返回那些statusLevel=10的项目。当传入的值介于1和9之间时,我希望返回该值(比如“5”)和小于10之间的所有项目

我让每个部分都能完美地独立工作,但我不知道如何让它们一起工作

AND ((@statusLevelID IS NULL OR project.statusLevelID >= @statusLevelID) AND (@statusLevelID IS NULL OR project.statusLevelID < 10))
AND (@statusLevelID IS NULL OR project.statusLevelID = 10)
和(@statusLevelID为NULL或project.statusLevelID>=@statusLevelID)和(@statusLevelID为NULL或project.statusLevelID<10))
和(@statusLevelID为NULL或project.statusLevelID=10)
使用“或”只会给我所有的项目

AND ((@statusLevelID IS NULL OR project.statusLevelID >= @statusLevelID) AND (@statusLevelID IS NULL OR project.statusLevelID < 10)
OR (@statusLevelID IS NULL OR project.statusLevelID = 10))
和(@statusLevelID为NULL或project.statusLevelID>=@statusLevelID)和(@statusLevelID为NULL或project.statusLevelID<10)
或(@statusLevelID为NULL或project.statusLevelID=10))
我在想一个案例陈述可能在这里起作用,但我不确定如何实现它


非常感谢您的帮助。提前感谢。

您可以这样写条件:

AND (
    @statusLevelID IS NULL
    OR
    project.statusLevelID BETWEEN @statusLevelID AND IIF(@statusLevelID = 10, 10, 9)
)

您希望一个布尔表达式通过
s连接:

AND ( (@statusLevelID IS NULL) OR
      (@statusLevelID = project.statusLevelID) OR
      (@statusLevelID <> 10 AND project.statusLevelID >= @statusLevelID AND project.statusLevelID < 10)
    )
和(@statusLevelID为NULL)或
(@statusLevelID=project.statusLevelID)或
(@statusLevelID 10和project.statusLevelID>=@statusLevelID和project.statusLevelID<10)
)

如果您正在生成动态sql,那么在生成之后不应该在where子句中引用空变量。这种方法否定了使用动态sql的意义。Erland对此进行了非常详细的讨论。谢谢,这也是一个答案,但我需要在使用IIF之前多了解一点,以防以后需要再次修改它。
IIF(cond,val1,val2)
只是
case WHEN cond THEN val1 ELSE val2 END