変更する必要がある既存の手順があり、非常に単純化して、以下の例のように記述します。
プロシージャは @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
これはばかげているように思えます。同じクエリの 2 つのコピーを保持する必要があります。SubjectID でフィルタリングするものとそうでないものです。すべてのサブジェクトの結果を取得するために、アプリケーションが SubjectID = 0 を渡すことを期待しているという事実を制御することはできません。
プロシージャの署名を変更できない場合、これを書き直して、2 つの別個のクエリを必要としないようにするにはどうすればよいでしょうか?
WHERE 句で CASE ステートメントを使用しようとしましたが、WHERE 述語の一部を条件付きで含める方法がわかりません。
この問題の英語訳は、「IF @SubjectID = 0、任意の SomeTable.SubjectID 値で結果を返し、ELSE は SomeTable.SubjectID = @SubjectID の結果のみを返す」です。
単一のクエリでそれを達成するにはどうすればよいですか (動的 SQL の提案はしないでください)。