9

2つのテーブルを選択して結合するプロシージャをSQLServerで作成したいと思います。パラメータ@company、@ from、および@toは常に設定されますが、@serie_typeはNULLにすることができます。@serie_typeがNULLでない場合は、指定されたタイプ(simple)を含めたいだけですAND S.Type = @serie_typeが、@ serie_typeがNULLの場合は、すべてのタイプ(simple)を含めたいので、ANDステートメントを含めないでください。私の問題は、@ serie_typeが設定されるかどうかわからないため、次のようなものが欲しいということです。

/* pseudocode */
??? = AND (IF @serie_type IS NOT NULL S.Type = @serie_type)

手順の簡略化されたバージョンは次のとおりです。

CREATE PROCEDURE Report_CompanySerie
    @company    INT,
    @serie_type INT,
    @from       DATE,
    @to         DATE
AS
BEGIN
    SELECT
        *
    FROM Company C
        JOIN Series S ON S.Company_FK = C.Id
    WHERE C.Id = @company 
        AND S.Created >= @from
        AND S.Created <= @to
/* HERE IS MY PROBLEM */        
        AND ???
END
GO

実際の選択はこれよりもはるかに大きいため、選択を複製したくない。

4

4 に答える 4

15

一般的なアプローチは次のとおりです。

WHERE 
C.Id = @company          
AND S.Created >= @from         
AND S.Created <= @to 
AND  (@serie_type IS NULL OR S.Type = @serie_type)
于 2011-09-22T11:26:58.243 に答える
11

SQL Serverにはこのロジックを実行するための関数が組み込まれているため、実行する必要 はありません。AND (@serie_type IS NULL OR S.Type = @serie_type)

これを試して:

   .
   .
   AND  S.Type = isnull( @serie_type, S.Type)

これは

@serie_typeがnullの場合はtrue、@serie_typeがnullでない場合は@serie_type=S.Typeの結果。

MSDNから:

IsNullNULLを指定された置換値に置き換えます。

ISNULL ( check_expression , replacement_value )

check_expressionの値は、NULLでない場合に返されます。それ以外の場合、タイプが異なる場合は、replacement_valueが暗黙的にcheck_expressionのタイプに変換された後に返されます。

于 2011-09-22T11:27:45.957 に答える
0

where句でcaseステートメントを使用することもできます

ここで、e.ZoneId = @ zoneid=0の場合はe.zoneidelse@zoneidend

于 2013-02-13T06:50:48.467 に答える
0

非常にクリーンなアプローチは、あなたを定義する@serie_typeこと0です。以下をご覧ください。

CREATE PROCEDURE Report_CompanySerie
    @company    INT,
    @serie_type INT = 0,
    @from       DATE,
    @to         DATE
AS
BEGIN
    SELECT
        *
    FROM Company C
        JOIN Series S ON S.Company_FK = C.Id
    WHERE C.Id = @company 
        AND S.Created >= @from
        AND S.Created <= @to
/* HERE IS MY PROBLEM */        
        AND (@serie_type = 0 OR S.SerieType = @serie_type)
    END
GO
于 2013-12-31T02:46:46.730 に答える