2012-04-17 35 views
13

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

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

ので、(他の何かが)いない状態のようにする必要があり、それはすることができます「> 0」の国IDは、すべての> 1からですが、私が使用する方法がわからない>と=同じ場合と同様に、 。

提案がありますか?あなたがすることができ

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

答えて

24

、いくつかの方法:

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

3

(something else)CountryがNULL可能であるならば、私は

+0

「国」はヌル可能ではないと仮定します。 –

+0

@MartinSmithいいキャッチ! – SliverNinja

1
.. ELSE a.Country ... 

も作るa.Country

する必要があります

WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country); 
1

はこれを試してみてくださいと仮定(something else)a.Country OR a.Country is NULL

5

関連する問題