0

これら 3 つの更新ステートメントを結合できるようにしたいので、個別に実行する必要はありません。通常、複数の「製品」と複数の「バスケット」を入力します。

これは、"fieldB" が < '5' である、または "fieldB" が '5' と '10' の間である、または "fieldB" > '10' であることに基づいて、3 つの個別のクエリを実行せずに 2 つのフィールドを更新できるようにするためです。

どんな援助も大歓迎です。

UPDATE table
set fieldA = round(8.7 * fieldA,0),
    fieldB = round(8.7 * fieldB,0)                                                                               
where product in ('APPLE','BANANA')
and basket IN ('BROWN BASKET','RED BASKET','YELLOW BASKET','BLUE BASKET')
and fieldB < '5';

UPDATE table
set fieldA = round(4.3 * fieldA,0),
    fieldB = round(4.3 * fieldB,0)                                                                               
where product in ('APPLE','BANANA')
and basket IN ('BROWN BASKET','RED BASKET','YELLOW BASKET','BLUE BASKET')
and fieldB between '5' and '10';

UPDATE table
set fieldA = round(2.5 * fieldA,0),
    fieldB = round(2.5 * fieldB,0)                                                                               
where product in ('APPLE','BANANA')
and basket IN ('BROWN BASKET','RED BASKET','YELLOW BASKET','BLUE BASKET')
and fieldB > '10';
4

2 に答える 2

3

ステートメントを使用できますCASEが、構文は RDBMS によって異なる場合があります。

UPDATE table
SET fieldA = CASE WHEN fieldB < '5' THEN round(8.7 * fieldA,0)
                  WHEN fieldB BETWEEN '5' AND '10' THEN round(4.3 * fieldA,0)
                  WHEN fieldB > '10' THEN round(2.5 * fieldA,0)
             END
    ,fieldB = CASE WHEN fieldB < '5' THEN round(8.7 * fieldB,0) 
                  WHEN fieldB BETWEEN '5' AND '10' THEN round(4.3 * fieldB,0) 
                  WHEN fieldB > '10' THEN round(2.5 * fieldB,0)  
             END                                                                            
where product in ('APPLE','BANANA')
and basket IN ('BROWN BASKET','RED BASKET','YELLOW BASKET','BLUE BASKET')
于 2013-07-17T20:22:21.553 に答える
2

あなたが望む意図はこれだと思います:

UPDATE table
    set fieldA = round((case when fieldB < '5' then 8.7 * fieldA
                             when fieldB between '5' and '10' then 4.3 * FieldA
                             when fieldB > '10' then 2.5 * fieldA
                        end), 0),
        fieldB = round((case when fieldB < '5' then 8.7 * fieldB
                             when fieldB between '5' and '10' then 4.3 * FieldB
                             when fieldB > '10' then 2.5 * fieldB
                        end), 0)                                                                               
    where product in ('APPLE', 'BANANA') and
          basket IN ('BROWN BASKET', 'RED BASKET', 'YELLOW BASKET', 'BLUE BASKET');

ただし、これは元の更新が行うこととまったく同じではありません。fieldB問題は、更新ごとに値をリセットしていることです。したがって、FieldB最初は 1の場合、 8.7 * FieldB=に設定され8.7ます。これは、2 回目の更新などで捕捉されます。

そのカスケードが意図されている場合、演算はわずかに異なります。ただし、条件付き更新の背後にある考え方は同じです。

于 2013-07-17T20:23:31.820 に答える