2016-06-20 7 views
0

私は 'WHERE'句の中のcase文について他のいくつかのQ &を読んだことがありますが、本当に使用方法を理解できません。私はコードのスニペットの下に投稿します。私は、ケースステートメントの使い方に関する基本的な原則を知らないと思います。そのため、コードはコンパイル/実行されません。私はどんな助けにも感謝します。私は上記の持っているかを説明するにはi.LastShpdのDESCSQLのケースステートメント:Where Where Clause

によって

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (Case 
    When n.OnOrder IN ('0', '') 
    Then i.OnOrder = 0 or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime))) 
    End) 

注文、私はすでに声明「から」「SELECT」と適切なを得ました。今私は、それらの表示された変数(ecx LastShpd)に基づいて結果をフィルタリングしています。 n.OnOrder = 0の場合、i.OnOrder = 0の行またはi.LastShpdが21日以上経過している行のみを保持したいと考えています。私はあなたがこのためにケースを必要としないと思う

+1

最後に論理を追加する必要があります。ケース n.OnOrder IN( '0'、 '') i.OnOrder = 0またはi.LastShpd damola

答えて

3

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (
    (n.OnOrder IN ('0', '') and i.OnOrder = 0) 
or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime) 
    ) 

多分あなたの質問を再読み込み、この他の方法である:WHERE句内CASEを使用する場合は、

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (
    n.OnOrder Not IN ('0', '') 
    or i.OnOrder = 0 
    or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime) 
    ) 
+1

それははるかに良い解決策です。ありがとうございます –

+0

@StevenDuncan - それが助けてうれしいです。私はCASEがWhere側よりもSelect側でより有用であると分かります。 – vercelli

1

操作の両側を定義する必要があります([ケース条件] = [SOMETHING])。これはあなたがしたいことに応じて厄介になることがありますが、最も簡単なことは、あなたのcase文を真/偽の条件として実行させて、[CASE] = 1または[CASE] = 0にすることです。

あなたのケースでは

(偶然のしゃれ!):もちろん

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (Case 
    When n.OnOrder IN ('0', '') AND (i.OnOrder = 0 or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime)) 
    THEN 1 
    ELSE 0 
    End) = 1 

別の答えが指摘したように、ケースは、この特定のインスタンスでは本当に必要ではありません。しかし、より複雑な条件があれば、これが役立つ可能性があります。

+0

私に事件を説明していただきありがとうございます。私はあなたが何かと同じように設定しなければならないことを認識していませんでした。これは私が引き続きSQLを学ぶのに役立ちます。 –

+0

@StevenDuncanあなたは 'WHERE'節でそれを使用するときに比較する必要があります。あなたは 'CASE'を' SELECT'でも使うことができます。そして、あなたは全く比較をしません。面白いことに、 'ORDER BY'で' CASE'を使って動的順序付けを行うこともできます。どのようにSQLを構成するかは、特定のコンテキストに依存します。 – Joel