update mit einem case

karni

Grünschnabel
hallo,

und zwar habe ich folgendes problem:
Ich möchte ein update einer Tabelle machen, nur mit EINER Anweisung die auf verschiedene WHERE Klauseln die Tabelle mit anderen Werten update.. Beispiel welcher bisher funtkioniert:

PHP:
UPDATE games SET platz = CASE id
 WHEN 5
 THEN 20
 WHEN 1
 THEN 50
 END

nur ist hier der Nachteil.. das ich immer wieder noch so ein Case eröffnen muss.. ich habe mir nun gerade den Wolf gesucht ob es auch anders geht und nichts gefunen daher wende ich mich an euch.. und zwarwollte ich das ungefähr so machen:

PHP:
UPDATE games SET CASE id
 WHEN 5
 THEN
   platz = 40
   tendenz = 1
   titel = 'neu'
 WHEN 1
 THEN
   platz = 50
   tendenz = 3
   titel = 'alt'
 END

Kennt sich da jemand aus ob es überhaupt so möglich ist?
Der SQL Code wird dann über PHP an mysql halt geschickt und dort verarbeitet.

Danke im Voraus
Karni
 
Hallo kami,

das was du bisher gemacht ist ziemlich gefährlich (und falsch):

UPDATE games SET platz = CASE id
WHEN 5
THEN 20
WHEN 1
THEN 50
END

Das kann nicht funktionieren!
Die CASE-Anweisung dient nicht als Ersatz für eine WHERE-Klausel!
D.h. er wird dennoch alle Datensätze durchgehen und updaten.

Da du aber keinen ELSE-Zweig in deinem CASE-Statement hast, wird "platz" auf NULL gesetzt für die Datensätze mit einer ID ungleich 5 oder 1.
Wenn die Spalte "platz" als NOT NULL definiert wurde, schlägt das UPDATE-Statement sogar fehl.

Um zu zeigen wie man es trotzdem damit lösen kann:

SQL:
UPDATE games 
   SET platz = 
   CASE id 
   WHEN 5 
     THEN 20 
   WHEN 1 
     THEN 50 
   ELSE
     platz
   END;


Mehrere Felder kannst du so, wie du angegeben hast, nicht gleichzeitig mit einer CASE-Anweisung updaten, da nur ein Result möglich ist.
Verschiedene Bedingungen kannst du hingegen kombinieren, z.B. so:

SQL:
UPDATE games 
   SET platz = 
   CASE
   WHEN (id IN (1,2,3,4)) AND (tendenz < 10)
     THEN 20 
   WHEN id = 100 
     THEN 50 
   ELSE
     platz
   END;


Das sagt die Online-Doku von MySQL zum CASE:
CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END

CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

Für meherere Bedingungen würde ich dir empfehlen entweder:

- mehrere getrennte UPDATE-Statements in deiner Host-Umgebung
- Stored Procedure in MySQL (mit mehreren unterschiedlichen UPDATE-Statements im Body der Procedure) implementieren

Hoffe es hilft,

Markus
 
Zuletzt bearbeitet:
Zurück