SQL - WHERE-Klausel auf jedem SET-Befehl in UPDATE?
-
07-07-2019 - |
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
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 ...
verwendenUPDATE 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.