Modulelessen (3/4)
Voorwaardelijke logica: CASE WHEN
Alles wat we tot nu toe hebben gezien, extraheert gegevens zoals ze zijn. Vaak wil je dat wel
om het te transformeren: classificeer salarissen in niveaus, markeer nieuwe medewerkers als
"junior", vertaal een numerieke code naar een leesbaar label. De standaard van SQL
tool hiervoor heet CASE WHEN.
De syntaxis: een mini if/else
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
...
ELSE default_value
ENDHet leest precies als een if/else if/else in welke taal dan ook: SQL evalueert
de voorwaarden in volgorde en stopt bij de eerste echte, het retourneren van de
overeenkomstige value. Als geen enkele waarde waar is, wordt de waarde ELSE geretourneerd. Als jij
laat de ELSE weg en er komt geen vertakking overeen, het retourneert NULL.
-- Classify employees by salary tier:
SELECT first_name,
last_name,
salary,
CASE
WHEN salary >= 50000 THEN 'Senior'
WHEN salary >= 35000 THEN 'Mid'
ELSE 'Junior'
END AS tier
FROM employees;De CASE leeft in de SELECT: hij produceert een kolom zoals elke andere
functie, en het is volkomen normaal om er een alias aan te geven met AS (hier
tier).
Waar kunt u CASE gebruiken?
Drie terugkerende plaatsen:
- In de
SELECTom afgeleide kolommen te maken (het bovenstaande voorbeeld). - In
ORDER BYvoor "aangepaste" sortering:SQLORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name; -- Engineering first, then the rest, alphabetically by last name. - Binnen aggregatiefuncties om "voorwaardelijk te tellen":
Dit patroon —SQL
SELECT COUNT(*) AS total, SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior, SUM(CASE WHEN salary < 35000 THEN 1 ELSE 0 END) AS junior FROM employees;SUM(CASE WHEN … THEN 1 ELSE 0 END)— komt het meest voor "voorwaardelijke telling" gebruikt in dashboards.
De "compacte" vorm
Er is ook een kortere variant als je een enkele uitdrukking vergelijkt tegen exacte waarden:
CASE department_id
WHEN 1 THEN 'Ingegneria'
WHEN 2 THEN 'Vendite'
ELSE 'Altro'
ENDHet is equivalent aan CASE WHEN afdeling_id = 1 THEN ... WHEN afdeling_id = 2 THEN ... END, gewoon compacter. Het werkt alleen voor exacte gelijkheid: if
je hebt >= of een andere vergelijking nodig, je moet teruggaan naar het uitgebreide
vorm.
Probeer het
Geef voor elke werknemer de voornaam (voornaam), achternaam (achternaam) en een kolom 'niveau' weer die 'Alto' is als het salaris minimaal 50.000 bedraagt, anders 'Standaard'. Drie kolommen, één rij per medewerker.
Toon hint
De voorwaarde is salaris >= 50000. Vergeet niet om de CASE af te sluiten met END en de alias 'tier' te gebruiken.
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
Tel voor elke afdeling (department_id) hoeveel werknemers een hoog salaris hebben (>= 50000) en hoeveel een standaardsalaris (< 50000), met behulp van SUM(CASE...). Drie kolommen: afdeling_id, hoog, standaard. Sorteer op afdeling_id (NULLS LAST).
Toon hint
Het SUM(CASE WHEN ... THEN 1 ELSE 0 END) patroon is de voorwaardelijke telling.
Oplossing beschikbaar na 3 pogingen