3

私はから次のことを達成したいcase when

If @chk='Y'  
    Select * From Table1 Where Column1=@Value  
Else If (@chk='N')
    Select * From Table1 Where Column1 In (Select column2 from Table2)

私はそれが次のようなものかもしれないと思います:

 Select * 
 From Table1 
 Where 
    Case  When @chk='Y' Then
        Column1=@Value
    Else
        Column1 In (Select column2 from Table2)
 End

以外の解決策があることを私は知っていますCase When。しかし、これを使用してこれを行うことは可能Case whenですか?

4

4 に答える 4

7

CASE は、単一の値を返す式です。フローの制御には使用されません。

WHERE (Column1 = @Value AND @chk = 'Y')
OR (@chk <> 'Y' AND Column1 IN (SELECT column2 FROM table2));
于 2012-05-25T12:44:18.657 に答える
4

CASE式のインライン評価に使用されます。これは、実際には動的WHERE句用ではありません。

あなたが求めていることの解決策はWHERE、括弧でグループ化された句を使用することです:

 Select * From Table1 
 Where 
 (@chk='Y' AND Column1=@Value)
 OR
 (@chk <> 'Y' AND Column1 In (Select column2 from Table2))
于 2012-05-25T12:44:13.223 に答える
1

私たちもそれを行うことがCASE WHENでき、それは理想的かもしれません. この質問に似た質問(表の1列に3つの条件)に答えました

Select * From Table1 
Where 
   CASE @Chk
   WHEN 'Y' THEN
        CASE WHEN Column1=@Value THEN 1 END 
   WHEN 'N' THEN
        CASE WHEN Column1 In (Select column2 from Table2) THEN 1 END
   END = 1

CASE短絡表現をいくらか強制することができます。

OR避けるべき理由の適切な例: http://www.sqlfiddle.com/#!6/29531/2

次の 2 つの機能的に同一のクエリがあるとします。

-- using CASE WHEN to convince your RDBMS to short-circuit things:
select count(*)
from usermessages um
join "user" u    
on
(case when um.friendId = 1 then um.sourceUserId else um.friendId end) = u.userId;


-- pure boolean approach, RDBMS can't short-circuit the OR expression
select count(*)
from usermessages um
join "user" u    
on 
(um.friendId = 1 and um.sourceUserId = u.userId)
or 
(um.friendId = u.userId);

http://www.sqlfiddle.com/#!6/29531/2からのサンプル データを考えると、最初のクエリにかかった時間はわずか 88 ミリ秒でしたが、2 番目のクエリには 4.7 秒かかりました。速度の違いは、ユーザーが非常に認識できます。

これは厳格な規則ではありません。RDBMS が実際にどのようにクエリを実行するかを確認する必要があります。を使用している場合、RDBMS はまだ入札を行わない (短絡) 場合がありますCASE WHEN。最良のルールは、クエリをプロファイリングすることです

于 2012-05-25T15:06:13.357 に答える
0

WHERE 句で Case ステートメントを使用できます。彼らのやり方は次のとおりです。

Select *
From Table1
Where (Case When @chk='Y' and Column1=@Value the 'Y'
            Else Column1 In (Select column2 from Table2)
       End) = 'Y'

通常、主に審美的な理由から、これを行うことは望ましくありません。そうは言っても、case を使用して記述されたコードは、where 内の対応するロジックよりも読みやすい場合があります。実際、これはそのような場合かもしれません。

ただし、より重要なのは、パフォーマンス上の理由または構文のために短絡したい状況です。WHERE 句を使用すると、サブクエリの評価がほぼ保証されます。CASE を使用して実行されない可能性があります。

エラーは別の状況です。SQL は WHERE 内の句の順序を保証しないため、次の例では、列が数値でない場合に SQL タイプ エラーが発生する可能性があります。

where isnumeric(val) = 1 and cast(val to float) < 100.0

一方、次のように動作します。

where (case when isnumeric(val) = 1 then cast(val to float) end) < 100.0

個人的には、このような状況に直面した場合、ケースをサブクエリに入れて、WHERE に列名を含めることを好みます。

于 2012-05-25T14:03:55.363 に答える