在SQL查询中有条件地应用WHERE子句

时间:2013-04-15 20:10:26

标签: sql sql-server where

我有一个我需要修改的预先存在的程序,并且以非常简单的方式,它的编写类似于下面的示例。

该过程在@StudentID和@SubjectID中传递,如果@SubjectID = 0,它执行查询而根本不对SubjectID进行过滤,否则它会执行完全相同的查询但过滤SubjectID。

CREATE PROCEDURE SomeProcedure
  @StudentID INT,   
  @SubjectID INT    
AS
BEGIN   
  IF(@SubjectID = 0)
  BEGIN  
    SELECT SomeColumns
    FROM SomeTable
    WHERE StudentID = @StudentID
  END 
  BEGIN  
    SELECT SomeColumns
    FROM SomeTable
    WHERE StudentID = @StudentID
    AND SubjectID = @SubjectID
  END 
END

这对我来说似乎很荒谬;我们现在必须维护同一个查询的两个副本;一个过滤主题ID而另一个不过滤。我无法控制应用程序希望传递SubjectID = 0以获取所有主题的结果这一事实。

鉴于我无法更改过程的签名,我该如何重写它以便它不需要两个单独的查询?

我尝试在WHERE子句中使用CASE语句,但我无法弄清楚如何有条件地包含WHERE谓词的部分内容。

此问题的英文翻译是“IF @SubjectID = 0,返回带有任何SomeTable.SubjectID值的结果,ELSE仅返回SomeTable.SubjectID = @SubjectID”的结果

如何在单个查询中完成该操作(请不要使用动态SQL建议)?

1 个答案:

答案 0 :(得分:6)

虽然我没有看到有两个单独查询的任何问题,但如果您只想使用一个查询,那么您可以执行以下操作:

SELECT SomeColumns
FROM SomeTable
WHERE StudentID = @StudentID
AND (SubjectID = @SubjectID OR @SubjectID = 0)