wake-up-neo.com

T-SQL: Verwenden eines CASE in einer UPDATE-Anweisung zum Aktualisieren bestimmter Spalten in Abhängigkeit von einer Bedingung

Ich frage mich, ob das überhaupt möglich ist. Ich möchte Spalte x aktualisieren, wenn eine Bedingung erfüllt ist, andernfalls würde Spalte y aktualisiert

UPDATE table SET
     (CASE (CONDITION) WHEN TRUE THEN columnx
                       ELSE columny
      END)
= 25

Ich habe überall gesucht, einige Dinge ausprobiert und kann keine Lösung finden. Ich denke, es ist nicht möglich, aber ich dachte, ich würde hier fragen und sehen, ob es schon jemand getan hat. Danke im Voraus.

89
pqsk

Sie können keine Bedingung verwenden, um die Struktur Ihrer Abfrage zu ändern, sondern nur die betroffenen Daten. Sie könnten dies tun:

update table set
    columnx = (case when condition then 25 else columnx end),
    columny = (case when condition then columny else 25 end)

Dies ist semantisch gleich, aber denken Sie daran, dass beide Spalten werden immer aktualisiert. Dies wahrscheinlich verursacht keine Probleme. Wenn Sie jedoch ein hohes Transaktionsvolumen haben, kann dies zu Problemen mit der Parallelität führen.

Die einzige Möglichkeit, speziell zu tun, besteht darin, dynamisches SQL zu verwenden. Dies ist jedoch etwas, von dem ich Sie ermutigen möchte, sich fernzuhalten. Die obige Lösung wird mit ziemlicher Sicherheit ausreichen, um das zu erreichen, wonach Sie suchen.

163
Adam Robinson
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END
22
Quassnoi

Ich weiß, das ist eine sehr alte Frage, aber das hat bei mir funktioniert:

UPDATE TABLE SET FIELD1 =
CASE 
WHEN FIELD1 = Condition1 THEN 'Result1'
WHEN FIELD1 = Condition2 THEN 'Result2'
WHEN FIELD1 = Condition3 THEN 'Result3'
END;

Grüße

enter image description here

Ich möchte meine ContactNo auf 8018070999 ändern oder aktualisieren, wobei 8018070777 unter Verwendung der Case-Anweisung vorhanden ist.

update [Contacts] set contactNo=(case 
when contactNo=8018070777 then 8018070999
else
contactNo
end)

enter image description here

1
Debendra Dash

Ich weiß, dass dies eine sehr alte Frage ist und das Problem als behoben markiert ist. Wenn jedoch jemand mit einem Fall wie dem meinen, bei dem die Tabelle bei Aktualisierungsereignissen einen Auslöser für die Datenprotokollierung hat, führt dies zu Problemen. Beide Spalten erhalten das Update und das Protokoll macht unbrauchbare Einträge. So wie ich es tat

IF (CONDITION) IS TRUE
BEGIN
    UPDATE table SET columnx = 25
END
ELSE
BEGIN
    UPDATE table SET columny = 25
END

Dies hat den weiteren Vorteil, dass keine unnötigen Schreibvorgänge wie bei den obigen Lösungen vorhanden sind.

1
Harsh