6 Stimmen

SQL - WHERE-Klausel bei jedem SET-Befehl in UPDATE?

Ich versuche, eine SQL-Abfrage in PHP zu erstellen, um eine Tabelle zu aktualisieren. Ist es möglich, eine andere WHERE Klausel für jede betroffene Zeile?

z.B. so etwas wie:

UPDATE table 
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2

usw.?

Jede Hilfe ist willkommen. Danke

14voto

David Andres Punkte 30563

Ja, das können Sie mit einer CASE-Anweisung.

UPDATE table
SET val = CASE someproperty  
           WHEN 1 THEN x 
           WHEN 2 THEN y
           ....
          ELSE
           val
          END

Es besteht nun die Sorge, dass eine CASE Anweisung ist weniger lesbar, wenn man sie mit mehreren UPDATE Erklärungen. Hier gibt es ein stichhaltiges Argument. Wenn zum Beispiel 1000 Zeilen aktualisiert werden, sieht es einfach besser aus und fühlt sich besser an, wenn man mehrere UPDATE Anweisungen als 1000 verschiedene Bedingungen zu einer einzigen CASE .

Manchmal ist jedoch eine CASE-Anweisung besser geeignet. Wenn Sie beispielsweise Zeilen auf der Grundlage eines Merkmals aktualisieren, z. B. der geraden oder ungeraden Natur des Wertes eines Feldes in der Tabelle, dann ist eine CASE Anweisung ist ein wunderbar prägnanter und wartbarer Weg, um Zeilen in der Tabelle zu aktualisieren, ohne auf eine große Anzahl von UPDATE Anweisungen, die alle eine bestimmte Art von Logik aufweisen. Nehmen wir zum Beispiel dies:

UPDATE table
SET val = CASE MOD(someproperty, 2)  
           WHEN 0 THEN x 
           WHEN 1 THEN y
          END

Dieser Ausdruck nimmt den Modulus von someproperty und weist, wenn 0 (gerade), val den Wert x zu und, wenn 1 (ungerade), val den Wert y. Je größer die Datenmenge ist, die durch diese Anweisung aktualisiert wird, desto sauberer ist sie im Vergleich zu einer Aktualisierung durch mehrere UPDATE Erklärungen.

Kurz gesagt, CASE Anweisungen sind manchmal genauso lesbar/pflegbar wie UPDATE Erklärungen. Es kommt ganz darauf an, was Sie mit ihnen erreichen wollen.

EDIT : Die ELSE-Klausel wurde hinzugefügt, um besonders sicher zu sein. Der OP ist möglicherweise daran interessiert, nur bestimmte Zeilen zu aktualisieren, so dass der Rest so bleiben sollte, wie er vor dem UPDATE war.

EDIT : Es wurde ein Szenario hinzugefügt, in dem der CASE Anweisung ist ein wirksamerer Ansatz als mehrere UPDATE Erklärungen.

9voto

Dan Polites Punkte 6670

Sie können nicht mehrere WHERE-Klauseln für eine SQL-Anweisung haben, aber Sie können eine CASE-Anweisung verwenden, um das zu erreichen, was Sie zu tun versuchen. Eine weitere Möglichkeit besteht darin, mehrere UPDATE-Anweisungen auszuführen.

Hier ist ein Beispiel, das die CASE-Anweisung verwendet:

UPDATE table
SET val = (
    CASE someproperty
        WHEN 1 THEN X
        WHEN 2 THEN Y
        ELSE val
    END
);

Hier ist ein Beispiel mit mehreren UPDATE-Anweisungen:

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

2voto

Kieveli Punkte 10750

Nö. Machen Sie zwei Updates daraus:

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

Wenn ich es mir recht überlege, könnten Sie auch Unterabfragen oder die Case-Anweisung verwenden...

UPDATE table SET val= ( case when someproperty = 1 then X when someproperty = 2 then Y else val END )

Möglicherweise müssen Sie eine Unterabfrage wie diese erstellen:

UPDATE table t1 SET val = ( select CASE when someproperty = 1 then X when someproperty = 2 then Y ELSE val END from table t2 where t1.primarykey = t2.primary key )

1voto

Ertugrul Kara Punkte 1120
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END

0voto

culebrón Punkte 30699

Ein kompakter und leicht skalierbarer Weg:

UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '1, 2'), X, Y);

die Abfrage auf diese Weise durchführen:

$condition = array(1, 2);
$newvals = array('X', 'Y');
$query = "UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '". implode(',', $condition). "', ". implode(', ', $newvals). ")";

Verwenden Sie prepare_query, um SQL-Syntaxfehler zu vermeiden, wenn Sie mit String-Werten arbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X