我有一个我需要修改的预先存在的程序,并且以非常简单的方式,它的编写类似于下面的示例。
该过程在@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建议)?
答案 0 :(得分:6)
虽然我没有看到有两个单独查询的任何问题,但如果您只想使用一个查询,那么您可以执行以下操作:
SELECT SomeColumns
FROM SomeTable
WHERE StudentID = @StudentID
AND (SubjectID = @SubjectID OR @SubjectID = 0)