it-swarm.com.de

Verwenden Sie CASE, um Spalten in der UPDATE-Abfrage auszuwählen.

Ich kann CASE verwenden, um auszuwählen, welche Spalten in einer SELECT - Abfrage (Postgres) angezeigt werden sollen, wie folgt:

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

Ist etwas Ähnliches überhaupt möglich, wenn eine UPDATE - Abfrage in Postgres ausgeführt wird (d. H. Wählen Sie aus, welche Spalten aktualisiert werden sollen)? Ich nehme nicht an, da ich nichts darüber finden konnte, aber vielleicht hat jemand eine clevere Alternative (außer eine Prozedur zu verwenden oder jede Spalte mit einem CASE zu aktualisieren, um zu bestimmen, ob dem Wert der Spalte eine neue zugewiesen werden soll Wert oder einfach den vorhandenen Wert neu zugewiesen). Wenn es keine einfache Alternative gibt, akzeptiere ich das natürlich auch als Antwort.

Zusätzliche Informationen: In meinem Fall habe ich 14 potenzielle Spalten, die aktualisiert werden können, wobei nur eine pro übereinstimmender Zeile aktualisiert wird (die zu aktualisierende Tabelle wird mit einer anderen in der Abfrage verknüpft). Die Anzahl der zu aktualisierenden Zeilen wird höchstwahrscheinlich variieren und Dutzende oder Hunderte betragen. Ich glaube, dass Indizes für die Beitrittsbedingungen vorhanden sind.

13
newenglander

Wenn Sie angeben, dass eine Spalte aktualisiert werden soll, wird sie immer aktualisiert. aber Sie können den eingegebenen Wert bedingt ändern und die ursprünglichen Werte abhängig von Ihren Bedingungen zurücksetzen. Etwas wie:

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   ...

Wenn die Bedingungen für eine Aktualisierung einer bestimmten Spalte nicht stimmen, geben Sie einfach den aktuellen Wert zurück.

Beachten Sie, dass für jede übereinstimmende Zeile wird eine Aktualisierung angezeigt wird (auch wenn alle Spalten auf die bereits vorhandenen Werte gesetzt werden) es sei denn Sie berücksichtigen diesen Umstand bei der Filterung explizit ON- und WHERE-Klauseln, die ein Leistungsproblem darstellen könnten (es wird ein Schreibvorgang durchgeführt, Indizes werden aktualisiert, entsprechende Trigger werden ausgelöst, ...), wenn sie nicht gemildert werden.

26
David Spillett

Wie viele verschiedene Kombinationen von Spalten müssen aktualisiert werden? Wie viele Zeilen der gesamten Tabelle werden aktualisiert? Sind Indizes für den schnellen Zugriff auf zu aktualisierende Zeilen vorhanden?

Abhängig von den Antworten auf diese Fragen können Sie möglicherweise mehrere Aktualisierungsanweisungen ausführen, eine für jede Spalte, die Sie aktualisieren möchten, und die Bedingung für den Wert dieser Spalte in der where-Klausel der Aktualisierung platzieren, sodass in dieser Spalte keine Zeilen aktualisiert werden hat den falschen Wert.

Versuchen Sie, satzbasiert zu denken. Gehen Sie nicht davon aus, dass für die Aktualisierung eine einzelne Zeile aktualisiert werden muss, die vom Primärschlüssel gefunden wurde.

5
Colin 't Hart