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

Jim*_*Jim 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

这个问题的英文翻译是"IF @SubjectID = 0,返回带有任何SomeTable.SubjectID值的结果,ELSE只返回SomeTable.SubjectID = @SubjectID的结果"

如何在单个查询中完成该任务(请不要动态SQL建议)?

Lam*_*mak 6

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

SELECT SomeColumns
FROM SomeTable
WHERE StudentID = @StudentID
AND (SubjectID = @SubjectID OR @SubjectID = 0)
Run Code Online (Sandbox Code Playgroud)