De CASE-expressie
IF/THEN-logica in een query.
De CASE-expressie is een gratis SQL Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject SQL Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus SQL Academy bevat in totaal 4 lessen.
Vertakkingslogica in SQL
Soms moet een query een beslissing nemen: als dit, dan dat, anders iets anders. SQL biedt hiervoor de expressie CASE.
Met CASE kun je verschillende waarden retourneren op basis van voorwaarden, direct binnen een SELECT. Zie het als de SQL-versie van een if/else-keten.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;Opbouw van een CASE
Een CASE-expressie bestaat uit een paar onderdelen:
WHEN condition THEN value— een of meer vertakkingenELSE value— een optionele terugvaloptieEND— sluit de expressie af (verplicht!)
SQL evalueert de WHEN-vertakkingen van boven naar beneden en retourneert de waarde van de eerste vertakking waarvan de voorwaarde waar is.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE retourneert een waarde
Het belangrijkste idee: een CASE-expressie evalueert tot één waarde per rij. Omdat de expressie een waarde oplevert, kun je die overal gebruiken waar een waarde is toegestaan — in de SELECT-lijst, in WHERE, in ORDER BY en zelfs binnen functies.
Hier krijgt elke order een eenvoudig statuslabel.
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;De eerste overeenkomst wint
De volgorde is belangrijk. SQL controleert elke WHEN in volgorde en stopt bij de eerste vertakking die waar is. Latere vertakkingen worden genegeerd, ook als ze eveneens overeenkomen.
Hieronder is een order boven 1000 'groot', nooit 'gemiddeld', omdat de eerste overeenkomende vertakking wint.
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;De ELSE-tak
De ELSE-tak is het vangnet. Als geen van de WHEN-voorwaarden waar is, retourneert CASE de waarde van ELSE.
Als je ELSE weglaat en niets overeenkomt, retourneert CASE NULL. Dat is een veelvoorkomende bron van onverwachte NULL-waarden, dus voeg een expliciete ELSE toe wanneer je een vastgelegde terugvalwaarde wilt.
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)Voorwaarden kunnen van alles zijn
Een WHEN-voorwaarde is gewoon een booleaanse expressie — hetzelfde soort expressie dat je in een WHERE-clausule schrijft. Je kunt vergelijkingen, AND, OR, BETWEEN, IN, LIKE en meer gebruiken.
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;Resultaattypen moeten compatibel zijn
Elke vertakking van een CASE moet waarden van een compatibel type retourneren, omdat de kolom één type nodig heeft. Het mengen van tekst en getallen veroorzaakt een fout of een onverwachte typeconversie.
Als je in de ene vertakking getallen en in de andere tekst nodig hebt, voer dan expliciet een typeconversie uit zodat de typen overeenkomen.
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;CASE gebruiken in WHERE
Omdat CASE een waarde oplevert, kun je het resultaat ervan vergelijken binnen een WHERE-clausule. Dat is handig voor dynamische filterregels.
Vaak is gewone booleaanse logica in WHERE echter duidelijker — gebruik CASE in WHERE alleen wanneer de vertakkingen de voorwaarde echt eenvoudiger maken.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;CASE nesten
Je kunt een CASE binnen een andere CASE-vertakking plaatsen om gelaagde logica uit te drukken. Dat werkt, maar diep geneste expressies worden moeilijk leesbaar.
Houd het nesten beperkt; als het te uitgebreid wordt, is een aparte kolom of een opzoektabel meestal overzichtelijker.
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;CASE met aggregatiefuncties
Een krachtig patroon: wikkel een CASE in een aggregatiefunctie zoals SUM of COUNT. Hiermee tel je rijen voorwaardelijk of tel je de waarden ervan op in één bewerking — dit wordt soms voorwaardelijke aggregatie of een draaitabel genoemd.
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;CASE bewust NULL laten retourneren
NULL retourneren vanuit een vertakking is soms precies wat je wilt — bijvoorbeeld om een waarde die je niet wilt weergeven leeg te maken, of om een latere aggregatiefunctie te voeden die NULL-waarden negeert.
Hier behouden alleen grote orders hun totaalbedrag; de andere worden NULL, zodat AVG ze overslaat.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;Kennischeck
Beschouw deze expressie voor een rij waarvoor total = 1500 geldt:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
Welke waarde levert deze op?
Samenvatting: de CASE-expressie
Je hebt de kern van voorwaardelijke logica in SQL geleerd:
CASE WHEN ... THEN ... ELSE ... ENDlevert één waarde per rij op- Vertakkingen worden van boven naar beneden gecontroleerd; de eerste overeenkomst wint
- Als je
ELSEweglaat, levert de expressieNULLop als niets overeenkomt - Alle vertakkingen moeten compatibele typen opleveren
CASEwerkt inSELECT,WHEREen binnen aggregatiefuncties
Hierna vergelijken we de twee syntactische vormen van CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;Leer SQL met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 46
- Lessen
- 183
Veelgestelde vragen
Is de les “De CASE-expressie” gratis?
Ja — de volledige tekst van “De CASE-expressie” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus SQL Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus SQL Academy bevat in totaal 4 lessen.
Wat leer ik in “De CASE-expressie”?
IF/THEN-logica in een query. Je oefent met SQL Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met SQL Academy te beginnen?
Ervaring vooraf is niet nodig. SQL Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “De CASE-expressie”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over SQL Academy?
Ja. Elke les over SQL Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- De CASE-expressie
- Gezochte versus eenvoudige CASE
- Gegevens indelen en labelen
- CASE in ORDER BY en aggregaties