Level 11: Bedingungen im Ergebnis: CASE
Aktualisiert am
Mittelstufe · Level 11 von 20. Ziel: Je nach Bedingung einen anderen Wert berechnen und Zeilen pro Kategorie zählen.
Themen: CASE WHEN … THEN … ELSE … END bedingtes Zählen
Lektion
CASE funktioniert wie ein „wenn… dann… sonst“: Es berechnet je nach Bedingung einen anderen Wert. Seine Form: CASE WHEN Bedingung THEN Wert WHEN andere_Bedingung THEN anderer_Wert ELSE Standardwert END. Das Ganze erzeugt einen einzigen Wert, dem man einen Alias gibt.
Die Bedingungen werden der Reihe nach geprüft, und die erste wahre gewinnt: Die folgenden werden nicht mehr betrachtet. Die Reihenfolge ist also wichtig. Steht WHEN rating >= 6.5 THEN 'good' zuerst, bekäme ein Film mit 8.2 'good' und nie 'top'. Schreibe die Bedingungen von der strengsten zur am wenigsten strengen.
Ohne ELSE erhält eine Zeile, die keine Bedingung erfüllt, NULL. Ein ausdrückliches ELSE vermeidet Überraschungen.
CASE lässt sich überall verwenden, wo ein Wert stehen kann. Im SELECT erzeugt es eine Kategorie. In einem GROUP BY gruppiert es nach Kategorie: wie viele ausgebuchte Flüge, wie viele nicht ausgebuchte. In einem ORDER BY legt es eine eigene Reihenfolge fest.
In einem Aggregat ermöglicht es bedingtes Zählen. SUM(CASE WHEN grade >= 10 THEN 1 ELSE 0 END) addiert 1 für jede Note von mindestens 10 und 0 für die anderen: Man erhält die Zahl der ausreichenden Noten. Mehrere SUM(CASE …) im selben SELECT zählen mehrere Kategorien in einer einzigen Zeile.
Nützliche Erinnerung für Quoten: Die Division zweier ganzer Zahlen ergibt eine ganze Zahl. seats_sold / capacity ergibt 0 für 150 / 180; seats_sold * 1.0 / capacity ergibt 0.833…
Syntax
SELECT col,
CASE
WHEN x >= 10 THEN 'hoch'
WHEN x >= 5 THEN 'mittel'
ELSE 'niedrig'
END AS stufe
FROM meine_tabelle;Kommentiertes Beispiel
SELECT title,
rating,
CASE
WHEN rating >= 7.5 THEN 'top'
WHEN rating >= 6.5 THEN 'good'
ELSE 'average'
END AS verdict
FROM movies;Ein Film mit der Bewertung 8.2 bleibt bei der ersten wahren Bedingung stehen und bekommt 'top'.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
Ergebnis des Beispiels
| title | rating | verdict |
|---|---|---|
| Night Train | 7.8 | top |
| Blue Harbor | 7.1 | good |
| Paper Moon City | 6.4 | average |
| Silent Peak | 8.2 | top |
| Last Signal | 7.5 | top |
| Summer Keys | 5.9 | average |
| Iron Garden | 8 | top |
| Dust and Gold | 6.8 | good |
| The Quiet Hour | 7.4 | good |
| Deep Current | 6.9 | good |
Das Wichtigste
- CASE … END erzeugt einen Wert abhängig von Bedingungen.
- Die erste wahre Bedingung gewinnt.
- SUM(CASE WHEN … THEN 1 ELSE 0 END) zählt unter einer Bedingung.
Häufige Fallen
- END vergessen erzeugt einen Syntaxfehler.
- Die Division zweier ganzer Zahlen ergibt eine abgerundete ganze Zahl: 150 / 180 ist 0. Multipliziere mit 1.0, um eine Quote zu erhalten.
SQLite-Besonderheit
Nach einem Alias zu gruppieren (GROUP BY band) funktioniert in SQLite, PostgreSQL und MySQL. SQL Server verbietet es und verlangt, den ganzen CASE-Ausdruck im GROUP BY zu wiederholen; Oracle akzeptiert es erst seit Version 23ai. Den Ausdruck zu wiederholen bleibt die portabelste Form.
Die 5 Übungen des Levels
- Zeige den Namen und den Preis jedes Produkts, mit einer Spalte price_band, die 'cheap' ist, wenn der Preis unter 20 liegt, und sonst 'expensive'.
- Zeige für jedes Spiel seine ID und eine Spalte result: 'home', wenn die Heimmannschaft gewonnen hat, 'away', wenn die Gastmannschaft gewonnen hat, 'draw' bei Unentschieden.
- Zeige ID, Typ und Preis der Zimmer: zuerst die Suiten, dann die Doppelzimmer, dann die Einzelzimmer; bei gleichem Typ vom teuersten zum günstigsten.
- Zeige in einer einzigen Zeile die Zahl der Noten von mindestens 10 (passed) und die Zahl der Noten unter 10 (failed).
- Teile die Flüge in 'full' (mindestens 90 % der Plätze verkauft) und 'not full' ein und zeige die Zahl der Flüge jeder Kategorie.
In SpeedQL wird jede Abfrage sofort geprüft: Ihr Ergebnis wird mit dem erwarteten verglichen, dann läuft die Abfrage noch einmal auf einer versteckten Kontrolldatenbank. Zu jeder Übung gibt es schriftliche Hinweise, die du nur bei Bedarf aufrufst.
Die Übungen von Level 11 machen
Kostenlos und ohne Anmeldung: Die Lektion und die 5 Übungen öffnen sich direkt in deinem Browser.
← Vorheriges Level: LEFT JOIN und mehrere Joins · Nächstes Level: Fehlende Werte (NULL) behandeln →