Level 11: Bedingungen im Ergebnis: CASE

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'.

Tabelle movies (10 Zeilen)
idtitlegenreyeardurationratingdirector_id
1Night TrainThriller20151187.81
2Blue HarborDrama20181027.12
3Paper Moon CityComedy2012956.45
4Silent PeakDrama20201318.23
5Last SignalSci-Fi20191427.51
6Summer KeysComedy2016885.94
7Iron GardenSci-Fi202112583
8Dust and GoldWestern20141106.82
9The Quiet HourDrama2022977.45
10Deep CurrentThriller20171056.9NULL

Ergebnis des Beispiels

titleratingverdict
Night Train7.8top
Blue Harbor7.1good
Paper Moon City6.4average
Silent Peak8.2top
Last Signal7.5top
Summer Keys5.9average
Iron Garden8top
Dust and Gold6.8good
The Quiet Hour7.4good
Deep Current6.9good

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

  1. Geführt · 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'. (Tabelle: products)
  2. Training · 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. (Tabelle: matches)
  3. Training · Zeige ID, Typ und Preis der Zimmer: zuerst die Suiten, dann die Doppelzimmer, dann die Einzelzimmer; bei gleichem Typ vom teuersten zum günstigsten. (Tabelle: rooms)
  4. Training · Zeige in einer einzigen Zeile die Zahl der Noten von mindestens 10 (passed) und die Zahl der Noten unter 10 (failed). (Tabelle: grades)
  5. Herausforderung · 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. (Tabelle: flights)

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.

Level 11 in SpeedQL öffnen

·