OnderwerpenSpiekbriefjeLessen
Lurndo › Onderwerpen › CASE

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
Resultaat
titelpaginasdikte
De stille rivier312gemiddeld
Nachtwacht in Brugge288gemiddeld
Het laatste licht401dik
Draken van het Noorden624dik
Koken met restjes176dun
The Glass Harbour352gemiddeld
Zomer in Zeeland256gemiddeld
De code van Mercator336gemiddeld

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
Resultaat
idterug_voorteruggebracht_opstatus
12024-11-252024-11-22op tijd
22024-12-232024-12-27te laat
32025-01-292025-01-22op tijd
42025-02-102025-02-19te laat
52025-02-242025-02-24op tijd
62025-03-082025-02-24op tijd
72025-03-222025-03-21op tijd
82025-04-022025-04-26te 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
Resultaat
naamemail
Sanne Willemssanne.willems@mail.be
Jef WoutersJef.Wouters@Mail.be
Amira El Idrissiamira.elidrissi@mail.be
Pieter Desmetpieter.desmet@mail.be
Lotte VandammeLOTTE.VANDAMME@MAIL.BE
Bert Claeysgeen e-mail
Nina De Clercqnina.declercq@mail.be
Hamid Benalihamid.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)
Resultaat
genreboekenengelstalig
fantasy30
non-fictie30
roman71
strip20
thriller51

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
← VorigeRekenen met datumsVolgende →Een vraag in een vraag
SQL-onderwerpenSpiekbriefjeExcelRanglijstAccountPrivacyEnglish