2

変更する必要がある既存の手順があり、非常に単純化して、以下の例のように記述します。

プロシージャは @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 の提案はしないでください)。

4

1 に答える 1

6

2 つの別個のクエリを使用することに特に問題はないと思いますが、1 つのクエリのみを使用する場合は、次のようにします。

SELECT SomeColumns
FROM SomeTable
WHERE StudentID = @StudentID
AND (SubjectID = @SubjectID OR @SubjectID = 0)
于 2013-04-15T20:11:46.450 に答える