2013-04-15 38 views
2

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

+0

请看下面的例子:HTTP:// asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:237794600346808562(BTW是这个Oracle吗?) –

+0

不,它的SQL Server。这是在一个标签,但被其他人编辑出来。 – Jim

回答

6

虽然我看不到任何东西真的错了具有两个单独的查询,如果你想使用只有一个查询,那么你就可以做到以下几点:

SELECT SomeColumns 
FROM SomeTable 
WHERE StudentID = @StudentID 
AND (SubjectID = @SubjectID OR @SubjectID = 0) 
+0

完美的作品。谢谢! – Jim

+0

@Jim没问题,很好,它帮助你 – Lamak

+0

再次感谢!仅供参考,两个单独查询的问题是,在真实的过程中,查询是巨大而复杂的,如果我们必须修改它,我们将不得不修改这两个版本,使其更容易复制/粘贴错误等等 – Jim