SQL leren: CASE
Kiezen met CASE
Sanne wil een overzicht met labels: dun of dik, op tijd of te laat, Nederlands of Engels. Die labels staan nergens in de database. Jij maakt ze.
CASE kiest per rij
CASE werkt als een reeks als-dan's: WHEN voorwaarde THEN waarde, en ELSE voor de rest. Het eindigt altijd met END. Met AS geef je de nieuwe kolom een naam.
De eerste WHEN die klopt, wint. De andere worden dan niet meer bekeken.
SELECT titel, paginas, CASE WHEN paginas < 200 THEN 'dun' WHEN paginas < 400 THEN 'gemiddeld' ELSE 'dik' END AS dikte FROM boeken| titel | paginas | dikte |
|---|---|---|
| De stille rivier | 312 | gemiddeld |
| Nachtwacht in Brugge | 288 | gemiddeld |
| Het laatste licht | 401 | dik |
| Draken van het Noorden | 624 | dik |
| Koken met restjes | 176 | dun |
| The Glass Harbour | 352 | gemiddeld |
| Zomer in Zeeland | 256 | gemiddeld |
| De code van Mercator | 336 | gemiddeld |
Eerst NULL afhandelen
Een vergelijking met NULL is nooit waar. Een boek dat nog weg is, valt dus door elke WHEN met < of > en belandt in de ELSE.
Daarom zet je de WHEN ... IS NULL vooraan: dan krijgt elke rij het juiste label.
SELECT id, terug_voor, teruggebracht_op, CASE WHEN teruggebracht_op IS NULL THEN 'nog weg' WHEN teruggebracht_op > terug_voor THEN 'te laat' ELSE 'op tijd' END AS status FROM uitleningen| id | terug_voor | teruggebracht_op | status |
|---|---|---|---|
| 1 | 2024-11-25 | 2024-11-22 | op tijd |
| 2 | 2024-12-23 | 2024-12-27 | te laat |
| 3 | 2025-01-29 | 2025-01-22 | op tijd |
| 4 | 2025-02-10 | 2025-02-19 | te laat |
| 5 | 2025-02-24 | 2025-02-24 | op tijd |
| 6 | 2025-03-08 | 2025-02-24 | op tijd |
| 7 | 2025-03-22 | 2025-03-21 | op tijd |
| 8 | 2025-04-02 | 2025-04-26 | te laat |
COALESCE, een korte CASE voor NULL
Wil je alleen een reservewaarde voor NULL, dan is COALESCE korter. COALESCE(email, 'geen e-mail') is hetzelfde als CASE WHEN email IS NULL THEN 'geen e-mail' ELSE email END.
Je mag meerdere waarden geven: COALESCE neemt de eerste die geen NULL is.
SELECT TRIM(naam) AS naam, COALESCE(email, 'geen e-mail') AS email FROM leden| naam | |
|---|---|
| Sanne Willems | sanne.willems@mail.be |
| Jef Wouters | Jef.Wouters@Mail.be |
| Amira El Idrissi | amira.elidrissi@mail.be |
| Pieter Desmet | pieter.desmet@mail.be |
| Lotte Vandamme | LOTTE.VANDAMME@MAIL.BE |
| Bert Claeys | geen e-mail |
| Nina De Clercq | nina.declercq@mail.be |
| Hamid Benali | hamid.benali@mail.be |
Tellen met CASE
CASE mag ook binnen een functie. SUM(CASE WHEN ... THEN 1 ELSE 0 END) telt per groep hoeveel rijen aan een voorwaarde voldoen: elke rij die klopt telt voor 1.
Zo krijg je in één query het totaal én een deel ervan.
SELECT LOWER(genre) AS genre, COUNT(*) AS boeken, SUM(CASE WHEN taal = 'en' THEN 1 ELSE 0 END) AS engelstalig FROM boeken GROUP BY LOWER(genre)| genre | boeken | engelstalig |
|---|---|---|
| fantasy | 3 | 0 |
| non-fictie | 3 | 0 |
| roman | 7 | 1 |
| strip | 2 | 0 |
| thriller | 5 | 1 |
Probeer het zelf
Toon per lid (lid_id) hoeveel uitleningen er te laat terugkwamen, en hoeveel uitleningen het lid in totaal had.
Klaar voor meer?
De volledige les heeft 6 oefeningen, van makkelijk naar uitdagend, met hints, punten en een reeks die je kan opbouwen.
Begin aan de les