WHERE
句に入力パラメータを含めるが、それがnullの場合は除外する最良の方法は何ですか?
私は信じている多くの方法がありますが、私はその時覚えていないようです。
COALESCE()
も使用できますか?しかし、これは値を選択するためだけのものだと思いますか?
明確にするために、_@code ="1"
_という変数を指定し、次に_Where type='B' AND code = @code
_を指定しますが、_@code is null
_の場合は_Where type='B'
_のみが必要です-欠落している_code = @code
_に注意してください。
IsNull を使用できます
where some_column = IsNull(@yourvariable, 'valueifnull')
[〜#〜] edit [〜#〜]:
コメントで説明したことは、次のように実行できます。
where (@code is null or code = @code)
どう?
WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
ここに別のアプローチがあります
SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
パラメータがNULLの場合、残りのOR式は評価されません。
このきちんとした記事をご覧ください こちら 。 「where(@param is null or Field = @ param)」がうまく機能しない理由と、代わりに何を使用するかを説明します。
別のソリューションで見つけた解決策を提案したいと思います サイト :
SELECT * FROM Thingies
WHERE ThingID = isnull(@ThingId,ThingID)
このソリューションでは、ユーザーがパラメーターにnull
を選択すると、クエリは結果としてすべての行を返します。
この質問は、私たちの何人かが少し頭を悩ましていたような同様の問題で本当に助けになりました。他の誰かが同じアプローチを試み、なぜそれが機能しないのか理解できない場合にのみ、私はそれを書きます。
@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])
ISNULL()を使用するか、他の人が述べたように明示的にnullをチェックできます。オプションの入力パラメーターが1つまたは2つ以下であれば、これで問題ありません。ただし、さらにパラメーターがある場合、これらの列に作成するインデックスは期待どおりに使用されないため、このアプローチは非常に非効率的です。このような場合、動的SQLを使用することをお勧めします。理由を説明する素晴らしい記事があります http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/