23

私はいくつかの検索を行っています。ユーザーはドロップダウンでいくつかの句を選択しています。ボックスを空のままにしておくと、クエリで句を無視するようにします。私はCASEを知っています。私が最もよく考えたのは、ストアドプロシージャのパラメーターに0を渡すと、このようにそのパラメーターが無視されるということです。

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE (something else) END)

したがって、(他の何か)は条件なしのようになります。国IDはすべて> 1からのものであるため、'> 0'にすることができますが、同じケースで>と=を使用する方法がわかりません。

助言がありますか?

4

5 に答える 5

36

いくつかの方法:

-- Do the comparison, OR'd with a check on the @Country=0 case
WHERE (a.Country = @Country OR @Country = 0)

-- compare the Country field to itself
WHERE a.Country = CASE WHEN @Country > 0 THEN @Country ELSE a.Country END

または、動的に生成されたステートメントを使用し、必要に応じて国の条件のみを追加します。これは、実際に適用する必要のある条件でのみクエリを実行するという意味で最も効率的であり、サポートインデックスが設定されている場合は、より良い実行プランが得られます。SQLインジェクションを防ぐには、パラメーター化されたSQLを使用する必要があります。

于 2012-04-17T12:44:17.240 に答える
5

次のように簡略化できます。

WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country);
于 2012-04-17T12:44:10.823 に答える
3

(something else)する必要がありますa.Country

Countrynull許容型の場合は(something else)a.Country OR a.Country is NULL

于 2012-04-17T12:41:56.330 に答える
1
.. ELSE a.Country ...

私は考えます

于 2012-04-17T12:42:06.023 に答える
1

これを試して:

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE a.Country END)
于 2012-04-17T12:42:38.140 に答える