2

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

该过程通过@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

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

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

我尝试在 WHERE 子句中使用 CASE 语句,但我不知道如何有条件地包含 WHERE 谓词的一部分。

这个问题的英文翻译是“IF @SubjectID = 0, return results with any SomeTable.SubjectID value, ELSE only return results where SomeTable.SubjectID = @SubjectID”

如何在单个查询中完成此操作(请不要提供动态 SQL 建议)?

4

1 回答 1

6

虽然我认为拥有两个单独的查询并没有什么问题,但如果您只想使用一个查询,那么您可以执行以下操作:

SELECT SomeColumns
FROM SomeTable
WHERE StudentID = @StudentID
AND (SubjectID = @SubjectID OR @SubjectID = 0)
于 2013-04-15T20:11:46.450 回答