1

クエリのCASEWHENでこのようなことをしようとしていますが、ANDの部分が含まれていません。構文にエラーがあると表示され、&&も使用されません。私はSQLの第一人者ではないので、助けていただければ幸いです。

   Total =
               CASE Payment.ID
                    WHEN 1 THEN  mytable.Total
                    WHEN 4 AND trans.Amount IS NULL THEN mytable.Total
                    WHEN 4 AND trans.Amount IS NOT NULL THEN mytable.Total - trans.Amount
                    ELSE '0'
               END,
4

2 に答える 2

5

これを行う1つの方法があります。式を次のように変更します。

スクリプト

Total = (CASE 
            WHEN Payment.ID = 1
                THEN  mytable.Total
            WHEN Payment.ID = 4 
                AND trans.Amount IS NULL 
                    THEN mytable.Total
            WHEN Payment.ID = 4 
                AND trans.Amount IS NOT NULL 
                    THEN mytable.Total - trans.Amount
            ELSE '0'
        END),

CASE式には、との2種類がありSimpleますSearched。SimpleとSearchedを同じ式で組み合わせることができません。

シンプル

CASE input
    WHEN 1 THEN 'a'
    WHEN 2 THEN 'b'
    WHEN 3 THEN 'c'
    ELSE ''
END

検索-Example 1:最も単純な形式。

CASE 
    WHEN input = 1 THEN 'a'
    WHEN input = 2 THEN 'b'
    WHEN input = 3 THEN 'c'
    ELSE ''
END

検索-Example 2:複数の列が含まれます。各WHENステートメントに複数の列を追加できます。

CASE 
    WHEN input = 1 AND second_column = 2 THEN 'a'
    WHEN input = 2 AND third_column  = 3 THEN 'b'
    WHEN input = 3 AND (second_column = 4 OR third_column = 6) THEN 'c'
    ELSE ''
END
于 2012-04-29T03:22:46.570 に答える
5

これは、同じクエリを表現するためのはるかに簡単な方法だと思います。

Total = CASE Payment.ID
  WHEN 1 THEN myTable.Total
  WHEN 4 THEN myTable.Total - COALESCE(trans.Amount, 0)
  ELSE 0
END,

Payment.ID考えられる結果は2つしかないため、= 4の条件は1つだけ必要です(減算するか、減算しないかのどちらかです。 (または)trans.Amountを使用してこれを簡略化できます)。もちろん、それを表現する方法は他にもあり、それらにはすべてメリットがあります。myTable.Totalが実際にはより複雑な式である場合、少なくともキーストロークに関しては、その式について1回だけ言及する方が効率的である可能性があります。これは、ロジックを少しシャッフルすることで実行できます。COALESCEISNULL

Total = CASE WHEN Payment.ID IN (1,4)
  THEN myTable.Total - CASE WHEN Payment.ID = 4 THEN
    COALESCE(trans.Amount, 0) ELSE 0 END
  ELSE 0
END,

元のコードに最も近い有効な構文は次のとおりです。

Total = CASE 
  WHEN Payment.ID = 1 THEN 
    myTable.Total
  WHEN Payment.ID = 4 AND trans.Amount IS NULL THEN 
    myTable.Total
  WHEN Payment.ID = 4 AND trans.Amount IS NOT NULL NULL THEN
    mytable.Total - trans.Amount
  ELSE
    0
END,

しかし、この場合、そこには多くの繰り返しがあり、1つの表現に3回言及します。場合によっては、これはパフォーマンスに悪影響を与える可能性があります(サブクエリやUDF呼び出しなど、その式の計算にコストがかかり、クエリロジックによって複数回計算された場合を想像してください)。エンジンは、いくらそれを上回ろうとしても、エンジンがやろうとしていることをやろうとしていることがありますが、注意しないと、間違いなく間違った道をたどることができます。

CASE重要なのは、それが単一の値を返す式であることを理解することです。多くの人は他の言語から来ており、それがフローの制御に使用できるステートメントであると想定しています。

于 2012-04-29T03:27:29.963 に答える