2013-04-15 43 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