我有一個預先存在的過程,我需要修改,並且以非常簡單的方式寫入類似於下面的示例。在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