web-dev-qa-db-ja.com

CASEを使用してUPDATEクエリの列を選択しますか?

次のように、CASEを使用して、SELECTクエリ(Postgres)に表示する列を選択できます。

SELECT CASE WHEN val = 0 THEN column_x
            WHEN val = 1 THEN column_y
            ELSE 0
       END AS update, ...

PostgresでUPDATEクエリを実行する場合、どのようなことも可能ですか(つまり、更新する列を選択してください)?私はこれについて何も見つけることができなかったのではないと思いますが、誰かが賢い代替手段を持っているかもしれません(プロシージャを使用するか、CASEを使用して各列を更新して、列の値に新しい値を割り当てる必要があるかどうかを判断する以外に値または単に既存の値を再割り当てします)。簡単な代替手段がない場合は、もちろんそれも答えとして受け入れます。

追加情報:私の場合、更新される可能性のある14の潜在的な列があり、一致する行ごとに1つだけが更新されます(更新されるテーブルはクエリで別のテーブルと結合されます)。更新する行の量はおそらく異なり、数十または数百になる可能性があります。結合条件の指標は整っていると思います。

13
newenglander

列を更新するように指定すると、常に更新されますbut条件に入力した値を変更し、条件に応じて元の値を戻すことができます。何かのようなもの:

UPDATE some_table
SET    column_x = CASE WHEN should_update_x THEN new_value_for_x ELSE column_x END
     , column_y = CASE WHEN should_update_y THEN new_value_for_y ELSE column_y END
     , column_z = CASE WHEN should_update_z THEN new_value_for_z ELSE column_z END
FROM   ...

したがって、特定の列の更新に条件が適切でない場合は、現在の値をフィードバックするだけです。

すべての行が一致したことに注意してくださいwill更新が表示されます(すべての列がすでに持っている値に設定されていても)nlessフィルタリングでこの状況を明示的にゲートします緩和されていない場合、パフォーマンスの問題になる可能性があるON句とWHERE句(書き込みが発生し、インデックスが更新され、適切なトリガーが起動するなど)。

26
David Spillett

更新する列の組み合わせはいくつありますか?テーブル全体のいくつの行が更新されますか?更新する行にすばやくアクセスするためのインデックスが用意されていますか?

これらの質問に対する回答によっては、更新する列ごとに1つずつ、複数の更新ステートメントを実行し、更新のwhere句でその列の値に条件を設定して、その列の場合に行が更新されないようにすることができます。値が間違っています。

セットベースで試してみてください。更新で主キーによって検出された単一の行を更新する必要があると想定しないでください。

5
Colin 't Hart