2012-02-21 19 views
0

特定の値が渡されたかどうかに基づいて適切な結果を返すときにCASEを使用する際に問題があります。何の郊外が渡されていない場合、それは唯一の都市を使用するように私は郊外がSQL Server 2008でCASEを使用する

WHEN @suburb <> '' THEN 
@suburb 
END 
= [Suburb] 
AND 
[City] = @city 

を渡された場合、クエリを実行したいと思います。例えば

は、しかし、どのように私は、クエリを実行しますか?

次のようにクエリを書くべきですか?

WHERE 
(
    [Suburb] = @suburb 
    AND 
    [City] = @city 
) 
OR 
(
    [City] = @city 
) 
+0

私は間違いなく2番目の形式で書いていません。 –

+0

@Aaron Bertrand - なぜ2番目にそれを書かないことをお勧めしますか? – PeanutsMonkey

+0

なぜ 'City = @ city'節を2回繰り返すのですか? –

答えて

1

あなたは本当にCASEを必要としません:

WHERE (suburb = @suburb OR @suburb = '' OR @suburb IS NULL) AND city = @city 
+0

それは魅力のように働いた。私はSQLの初心者としての質問です。 OR文が最初の条件が満たされない場合にのみ実行されると推測しています。 'suburb = @ suburb'が値を持たない場合は' @suburb = '' 'を処理します。 tharは正しいですか? – PeanutsMonkey

+1

いいえ、SQLは短絡しません。すべての式が評価されます。 –

+0

http://weblogs.sqlteam.com/jeffs/archive/2003/11/14/513.aspxの記事は、私が誤解していない限り、それを示唆しているようです。すべての条件が評価されれば、それらの条件がすべて満たされている可能性がありますか? – PeanutsMonkey

1

SQL Server 2008を使用しているので、あなたは不適切な計画をキャッシュ避けるために、ここにOPTION (RECOMPILE)ヒントを使用することをお勧めします。詳細はCatch-all queriesを参照してください。

... 
WHERE ((@suburb = '') OR (@suburb <> '' AND [Suburb] = @suburb)) 
    AND [City] = @city 
OPTION (RECOMPILE) 
+0

+1パラメータスニッフィングの危険に対処する –

1

達成するために、いくつかの代替方法がありますが、あなたはPerson.vAdditionalContactInfo FROM

WHERE [City] = @city 
AND ([Suburb] = @suburb OR '' = '') 
0
SELECT FirstName, LastName, TelephoneNumber, "When to Contact" = 
CASE 
     WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time' 
     ELSE TelephoneSpecialInstructions 
END 

。これらのいずれかを試すことができます。

関連する問題