Frage

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

zB so etwas wie:

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

etc?

Jede Hilfe sehr geschätzt. Dank

War es hilfreich?

Lösung

Sie können nicht mehrere haben WHERE-Klauseln für jede SQL-Anweisung, jedoch können Sie eine CASE-Anweisung verwenden, um zu erreichen, was Sie zu tun versuchen. Eine weitere Option, die Sie haben, ist mehrere Update-Anweisungen auszuführen.

Hier wird eine Probe mit der CASE-Anweisung:

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

Hier ist ein Beispiel mehr Update-Anweisungen mit:

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

Andere Tipps

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

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

Nun gibt es Bedenken, dass eine CASE Aussage weniger lesbar ist, wenn im Vergleich zu mehreren UPDATE Aussagen. Es ist ein gültiges Argument hier. Wenn zum Beispiel 1000 Zeilen aktualisiert werden, es fühlt sich einfach und sieht besser aus mehreren UPDATE Aussagen zu verwenden, anstatt 1000 verschiedene Bedingungen zu einem einzigen CASE.

Aber manchmal eine CASE-Anweisung ist besser geeignet. Wenn zum Beispiel aktualisieren Sie Zeilen basierend auf einigen Merkmal sagen, die gerade oder ungerade Natur des Wertes des Feldes der Tabelle, dann ist eine CASE Aussage ein wunderbar prägnant und wartbar Weg Zeilen in der Tabelle zu aktualisieren, ohne dass ein greifen große Anzahl von UPDATE Aussagen, die alle eine bestimmte Art von Logik teilen. Nehmen Sie diese zum Beispiel:

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

Dieser Ausdruck hat einen Modul von someproperty und bei 0 (gerade), Wert x val zuordnet und, wenn 1 (ungerade), den Wert y zu val zuordnet. Je größer das Volumen der Daten, die von dieser Anweisung aktualisiert werden, desto sauberer ist es im Vergleich zu tun, so durch mehr UPDATE Aussagen.

Kurz gesagt, CASE Aussagen sind manchmal genauso lesbar / wartbar als UPDATE Aussagen. Es hängt alles davon ab, was Sie versuchen, mit ihnen zu tun.

Bearbeiten : Hinzugefügt wurde die ELSE-Klausel sein extra sicher. Die OP kann nur bestimmte Zeilen bei der Aktualisierung interessiert sein, damit der Rest, wie sie vor dem UPDATE bleiben sollte.

Bearbeiten : ein Szenario, in dem die CASE Aussage ist ein effektiver Ansatz als mehrere UPDATE Aussagen hinzugefügt.

Nein. Machen Sie es zwei Updates:

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

Am zweiten Gedanken, können Sie Unterabfragen oder die Case-Anweisung ...

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

Sie müssen möglicherweise machen, dass eine Sub-Abfrage wie folgt aus:

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 )
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END

Eine kompakte und leicht skalierbare Art und Weise:

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

die Abfrage auf diese Weise machen:

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

Verwenden prepare_query SQL-Syntax-Fehler zu vermeiden, wenn Sie mit String-Werten befassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top