web-dev-qa-db-ja.com

Nullでない場合は入力パラメーターを確認し、SQL Serverのどこで使用するか

WHERE句に入力パラメータを含めるが、それがnullの場合は除外する最良の方法は何ですか?

私は信じている多くの方法がありますが、私はその時覚えていないようです。

COALESCE()も使用できますか?しかし、これは値を選択するためだけのものだと思いますか?

編集

明確にするために、_@code ="1"_という変数を指定し、次に_Where type='B' AND code = @code_を指定しますが、_@code is null_の場合は_Where type='B'_のみが必要です-欠落している_code = @code_に注意してください。

34
Martin

IsNull を使用できます

 where some_column = IsNull(@yourvariable, 'valueifnull')

[〜#〜] edit [〜#〜]

コメントで説明したことは、次のように実行できます。

where (@code is null or code = @code)
66

どう?

WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
9
Adriaan Stander

ここに別のアプローチがあります

SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )

パラメータがNULLの場合、残りのOR式は評価されません。

7

このきちんとした記事をご覧ください こちら 。 「where(@param is null or Field = @ param)」がうまく機能しない理由と、代わりに何を使用するかを説明します。

6
DForck42

別のソリューションで見つけた解決策を提案したいと思います サイト

SELECT * FROM Thingies 
WHERE ThingID = isnull(@ThingId,ThingID)

このソリューションでは、ユーザーがパラメーターにnullを選択すると、クエリは結果としてすべての行を返します。

5
ali

この質問は、私たちの何人かが少し頭を悩ましていたような同様の問題で本当に助けになりました。他の誰かが同じアプローチを試み、なぜそれが機能しないのか理解できない場合にのみ、私はそれを書きます。

@Parameterがnullでない場合、マルチパートWHERE句の一部のみを評価しようとしました。私はこれを以下のようにしようとしましたが、@ Parameterがnullの場合は常に行が返されませんでした。

DECLARE @Parameter int = null;

SELECT  *  FROM  TABLE
WHERE   [AlternateID] is not null 
        AND (@Parameter is not null AND [AlternateID] = @Parameter)

(@Parameter is not null AND [AlternateID] = @Parameter)は、@ Parameterがnullであるため、完全なWHERE句の一部を形成しません。ただし、WHERE句全体がfalseを返していました。解決策は、以下のようにOR 1 = 1を追加することでした。

WHERE   [AlternateID] is not null 
        AND (@Parameter is not null AND [AlternateID] = @Parameter OR 1=1)

もちろん、ALiによって概説されたアプローチ(賛成するのに十分な評判ではない)は、これをより効率的に解決します。

WHERE   [AlternateID] is not null 
        AND [Partner_Customer_ID] = ISNULL(@Parameter, [Partner_Customer_ID])    
3

ISNULL()を使用するか、他の人が述べたように明示的にnullをチェックできます。オプションの入力パラメーターが1つまたは2つ以下であれば、これで問題ありません。ただし、さらにパラメーターがある場合、これらの列に作成するインデックスは期待どおりに使用されないため、このアプローチは非常に非効率的です。このような場合、動的SQLを使用することをお勧めします。理由を説明する素晴らしい記事があります http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

1
Sadhir