我有一个预先存在的过程,我需要修改,并且以非常简单的方式写入类似于下面的示例。在SQL查询中有条件地应用WHERE子句
过程在@StudentID和@SubjectID中传递,并且如果@SubjectID = 0,它将执行查询而不对基本ID进行过滤,否则它将执行完全相同的查询,但会过滤出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,与任何SomeTable.SubjectID值返回结果,只有ELSE返回结果,其中SomeTable.SubjectID = @SubjectID”
我怎样才能做到在一个单个查询(并请不要动态SQL建议)?
请看下面的例子:HTTP:// asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:237794600346808562(BTW是这个Oracle吗?) –
不,它的SQL Server。这是在一个标签,但被其他人编辑出来。 – Jim