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建议)?
虽然我没有看到有两个单独查询的任何问题,但如果您只想使用一个查询,那么您可以执行以下操作:
SELECT SomeColumns
FROM SomeTable
WHERE StudentID = @StudentID
AND (SubjectID = @SubjectID OR @SubjectID = 0)
Run Code Online (Sandbox Code Playgroud)