Direct naar de hoofdinhoud
Module 4 · Les 3 van 415/57 in de cursus~10 min
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

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

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

SQL
-- 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:

  1. In de SELECT om afgeleide kolommen te maken (het bovenstaande voorbeeld).
  2. In ORDER BY voor "aangepaste" sortering:
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Engineering first, then the rest, alphabetically by last name.
  3. Binnen aggregatiefuncties om "voorwaardelijk te tellen":
    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;
    Dit patroon — 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:

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

Het 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

Oefening#sql.m4.l3.e1
Pogingen: 0Laden…

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.

Editor laden…
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

Oefening#sql.m4.l3.e2
Pogingen: 0Laden…

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

Editor laden…
Toon hint

Het SUM(CASE WHEN ... THEN 1 ELSE 0 END) patroon is de voorwaardelijke telling.

Oplossing beschikbaar na 3 pogingen