web-dev-qa-db-ja.com

Caseを使用して複数の列を更新する

以下のようなクエリがあります。

UPDATE some_table
SET column_x = CASE WHEN x_specific_condition THEN new_value_for_x ELSE column_x END,
    column_y = CASE WHEN y_specific_condition THEN new_value_for_y ELSE column_y END, 
WHERE some_more_conditions

上記の問題は、some_more_conditionsがtrueを返す特定の条件に関係なくtrueを返す場合、各列(x、y)は引き続き独自の値で更新されます。 ELSEを上から削除しようとしましたが、うまくいきませんでした

Some_more_conditionsは両方のケースで同じなので、私は組み合わせています。1回の更新ですべてを実行する方が良いと思います(提案は歓迎します)

特定の条件が一致しない個々の列をスキップして、上記の更新を1つのクエリで実行できる方法があるかどうかを知っていますか(基本的に同じ値の上書きを避けます)

2
Rachit

UPDATEのSET句で指定された両方の列は、allsome_more_conditions、何があってもx_specific_conditionまたはy_specific_conditionは評価することがあります。単一のステートメントに固執している間、これを回避する構文はありません。

だから、それと一緒に暮らすか、2つのステートメントを実行します。

UPDATE some_table
SET column_x = new_value_for_x
WHERE some_more_conditions
  AND x_specific_condition;

UPDATE some_table
SET column_y = new_value_for_y
WHERE some_more_conditions
  AND y_specific_condition;
3
Andriy M