Werte auswählen mit CASE
Manchmal soll eine Spalte für verschiedene Zeilen Verschiedenes sagen: „günstig“ für einige Spiele, „teuer“ für andere. Dafür gibt es CASE. Es geht der Reihe nach durch Bedingungen und liefert den Wert der ersten, die zutrifft:
SELECT titel, preis,
CASE
WHEN preis < 20 THEN 'günstig'
WHEN preis < 40 THEN 'normal'
ELSE 'teuer'
END AS kategorie
FROM spiele
LIMIT 4;| titel | preis | kategorie |
|---|---|---|
| Dragon Forge | 40 | teuer |
| Pixel Racer | 15 | günstig |
| Moon Farm | 20 | normal |
| Castle Siege | 30 | normal |
Lies es so: Wenn der Preis unter 20 liegt, dann „günstig“; wenn er unter 40 liegt, dann „normal“; sonst (ELSE) „teuer“. CASE beginnt die Auswahl und END beendet sie, und das Ganze ist ein einziger Wert, der wie jede Berechnung mit AS einen Namen bekommt. Die Bedingungen sind die, die du aus WHERE kennst, sie können also AND, OR, IN, LIKE oder IS NULL benutzen, und die Werte können Texte, Zahlen oder Berechnungen sein. Schreibe jedes WHEN in eine eigene Zeile, damit du sie wie eine Liste lesen kannst.
Die Reihenfolge der WHENs ist wichtig. SQLite prüft sie von oben und hört bei der ersten auf, die zutrifft. Moon Farm kostet 20 €: Die erste Bedingung trifft nicht zu, die zweite schon, also ist es „normal“, und der Rest wird übersprungen. Würdest du die ersten beiden Zeilen vertauschen, sodass WHEN preis < 40 zuerst käme, wäre auch Cube Logic für 5 € „normal“: 5 ist kleiner als 40, und SQLite käme nie zur Zeile mit „günstig“. Wenn sich Bedingungen überschneiden, setze also die engste zuerst.
Ohne ELSE bekommen die Zeilen, die zu keiner Bedingung passen, den Wert NULL.
Wenn alle Bedingungen eine Spalte mit einem Wert vergleichen, gibt es eine kürzere Form: Die Spalte steht direkt nach CASE, und jedes WHEN hat nur noch den Wert:
SELECT id, status,
CASE status
WHEN 'bezahlt' THEN 'OK'
WHEN 'erstattet' THEN 'Geld zurück'
END AS hinweis
FROM bestellungen
WHERE id BETWEEN 6 AND 8;| id | status | hinweis |
|---|---|---|
| 6 | bezahlt | OK |
| 7 | erstattet | Geld zurück |
| 8 | bezahlt | OK |
Typischer Fehler: ein vergessenes END. Ohne es weiß SQLite nicht, wo das CASE endet, und es bricht beim ersten Wort ab, das es nicht erwartet hat: near "AS": syntax error. Wenn du einen solchen Fehler bei einem CASE bekommst, prüfe, ob es sein END hat.
So schreibst du es:
Anweisungen
- 1
Eltern wollen wissen, welche Spiele für wen gedacht sind. Zeige den Titel, die Altersfreigabe und
zielgruppe:Erwachsenefür Spiele ab 18,Jugendlichefür Spiele ab 12 undKinderfür die übrigen. Sortiere die Spiele nach der Altersfreigabe, die höchste zuerst, und Spiele mit derselben Freigabe nach dem Titel:titel altersfreigabe zielgruppe Zombie Town 18 Erwachsene Dragon Forge 16 Jugendliche Knight's Oath 16 Jugendliche Robot Rebellion 16 Jugendliche Shadow Ninja 16 Jugendliche Castle Siege 12 Jugendliche … … … - 2
Zeige darunter die Bewertungen der Spiele 1 und 2: die
spiel_id, diekunde_id, die Sterne undurteil:positivbei 4 oder 5 Sternen,neutralbei 3 Sternen undnegativbei weniger. Sortiere die Bewertungen nachspiel_idund dann nachkunde_id:spiel_id kunde_id sterne urteil 1 1 4 positiv 1 2 5 positiv 1 5 3 neutral 1 8 5 positiv 2 5 4 positiv 2 6 2 negativ