web-dev-qa-db-ja.com

WHERE、SQL Serverのケース

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

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

したがって、(他の)条件はないはずです。国IDはすべて> 1であるため、「> 0」になる可能性がありますが、同じCASEで>および=を使用する方法がわかりません。

助言がありますか?

19
el ninho

いくつかの方法:

-- 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を使用する必要があります。

28
AdaTheDev

あなたはに簡素化することができます:

WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country);
5
Aaron Bertrand

(something else)a.Country

Countryがヌル可能の場合、make(something else) be a.Country OR a.Country is NULL

3
.. ELSE a.Country ...

私は考えます

1
tanathos

これを試して:

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE a.Country END)
1
Mahmoud Gamal