我有一个预先存在的程序需要修改,并且以非常简化的方式编写,类似于下面的示例。
该过程通过@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 建议)?