Ga naar hoofdinhoud

NULL functies

Als de waarde NULL is, is de inhoud onbeschikbaar, niet bekend of niet van toepassing. NULL is niet hetzelfde als 0 of een spatie, want een 0 is een getal en een spatie is een karakter. Maar soms weet je de inhoud van een kolom niet. We zeggen dan dat de inhoud NULL is.

Als je vermenigvuldigt met NULL of deelt door NULL, dan is het resultaat NULL. Je kunt dus wel delen door NULL maar niet door 0 want delen door 0 is verboden.

Soms wil je NULL vervangen door een andere waarde, bijvoorbeeld als je wil rekenen met de cellen die NULL zijn of als je met een bepaalde tekst aan wil geven dat de inhoud NULL is. Je kunt dan met een functie NULL vervangen door een andere inhoud, bijvoorbeeld door 0 of door een bepaalde tekst.

Hier zijn twee verschillende functies voor te gebruiken: IFNULL en COALESCE.

Ifnull

Er zijn maar vier personeelsleden die een commission_pct hebben (commissie krijgen). Commissie is een bepaald percentage dat je extra krijgt boven op je loon. Dat percentage kan gaan over de verkopen die je hebt gedaan of gewoon als percentage boven op je loon. Hoe meer je dan verkoopt, hoe hoger je commissiepercentage dan kan worden.

SELECT last_name, commission_pct AS commissie
FROM employees;
last_namecommissie
KingNULL
KochharNULL
De HaanNULL
HunoldNULL
ErnstNULL
LorentzNULL
MourgosNULL
RajsNULL
DaviesNULL
MatosNULL
VargasNULL
Zlotkey0.2
Abel0.3
Taylor0.2
Grant0.15
WhalenNULL
HartsteinNULL
FayNULL
HigginsNULL
GietzNULL
SELECT last_name, IFNULL(commission_pct, 'geen') AS commissie
FROM employees;
last_namecommissie
Kinggeen
Kochhargeen
De Haangeen
Hunoldgeen
Ernstgeen
Lorentzgeen
Mourgosgeen
Rajsgeen
Daviesgeen
Matosgeen
Vargasgeen
Zlotkey0.2
Abel0.3
Taylor0.2
Grant0.15
Whalengeen
Hartsteingeen
Faygeen
Higginsgeen
Gietzgeen

Als je wil rekenen met de waarden in een kolom die NULL kunnen zijn, dan gaat het mis met de berekeningen. Als je met NULL rekent, is het resultaat namelijk NULL.

SELECT last_name,
salary,
commission_pct AS commissiepercentage,
salary * commission_pct AS commissie,
salary + salary * commission_pct AS totaalsalaris,
FROM employees;
last_namesalarycommissiepercentagecommissietotaalsalaris
King24000NULLNULLNULL
Kochhar17000NULLNULLNULL
De Haan17000NULLNULLNULL
Hunold9000NULLNULLNULL
Ernst6000NULLNULLNULL
Lorentz4200NULLNULLNULL
Mourgos5800NULLNULLNULL
Rajs3500NULLNULLNULL
Davies3100NULLNULLNULL
Matos2600NULLNULLNULL
Vargas2500NULLNULLNULL
Zlotkey105000.22100.012600.0
Abel110000.33300.014300.0
Taylor86000.21720.010320.0
Grant70000.151050.08050.0
Whalen4400NULLNULLNULL
Hartstein13000NULLNULLNULL
Fay6000NULLNULLNULL
Higgins12000NULLNULLNULL
Gietz8300NULLNULLNULL

Als je NULL vervangt door 0 in de kolom commission_pct gaan de berekeningen wel goed.

 SELECT last_name,
salary AS salaris,
IFNULL(commission_pct, 0) AS commissiepercentage,
salary * IFNULL(commission_pct, 0) AS commissie,
ROUND(salary + salary * IFNULL(commission_pct, 0)) AS totaalsalaris
FROM employees;
last_namesalariscommissiepercentagecommissietotaalsalaris
King240000024000.0
Kochhar170000017000.0
De Haan170000017000.0
Hunold9000009000.0
Ernst6000006000.0
Lorentz4200004200.0
Mourgos5800005800.0
Rajs3500003500.0
Davies3100003100.0
Matos2600002600.0
Vargas2500002500.0
Zlotkey105000.22100.012600.0
Abel110000.33300.014300.0
Taylor86000.21720.010320.0
Grant70000.151050.08050.0
Whalen4400004400.0
Hartstein130000013000.0
Fay6000006000.0
Higgins120000012000.0
Gietz8300008300.0

Tenslotte zetten we nog een procentteken en enkele dollartekens met CONCAT.

SELECT last_name,
('$ ' || salary) AS basissalaris,
(IFNULL(commission_pct, 0) || ' %') AS commissiepercentage,
('$ ' || (salary * IFNULL(commission_pct, 0))) AS commissie,
('$ '|| ROUND(salary + salary * IFNULL(commission_pct, 0))) AS totaalsalaris
FROM employees;
last_namebasissalariscommissiepercentagecommissietotaalsalaris
King$ 240000 %$ 0$ 24000.0
Kochhar$ 170000 %$ 0$ 17000.0
De Haan$ 170000 %$ 0$ 17000.0
Hunold$ 90000 %$ 0$ 9000.0
Ernst$ 60000 %$ 0$ 6000.0
Lorentz$ 42000 %$ 0$ 4200.0
Mourgos$ 58000 %$ 0$ 5800.0
Rajs$ 35000 %$ 0$ 3500.0
Davies$ 31000 %$ 0$ 3100.0
Matos$ 26000 %$ 0$ 2600.0
Vargas$ 25000 %$ 0$ 2500.0
Zlotkey$ 105000.2 %$ 2100.0$ 12600.0
Abel$ 110000.3 %$ 3300.0$ 14300.0
Taylor$ 86000.2 %$ 1720.0$ 10320.0
Grant$ 70000.15 %$ 1050.0$ 8050.0
Whalen$ 44000 %$ 0$ 4400.0
Hartstein$ 130000 %$ 0$ 13000.0
Fay$ 60000 %$ 0$ 6000.0
Higgins$ 120000 %$ 0$ 12000.0
Gietz$ 83000 %$ 0$ 8300.0

Om de query overzichtelijk te houden, wordt soms de volgende notatie gehanteerd:

SELECT last_name,
CONCAT('$ ',salary) AS basissalaris,
CONCAT(IFNULL(commission_pct, 0), ' %') AS commissiepercentage,
CONCAT('$ ', salary * IFNULL(commission_pct, 0)) AS commissie,
CONCAT('$ ', ROUND(salary + salary * IFNULL(commission_pct, 0))) AS totaalsalaris
FROM employees;

Coalesce

COALESCE kan hetzelfde als IFNULL.

SELECT last_name, COALESCE(commission_pct, 'geen') AS commissie
FROM employees;
last_namecommissie
Kinggeen
Kochhargeen
De Haangeen
Hunoldgeen
Ernstgeen
Lorentzgeen
Mourgosgeen
Rajsgeen
Daviesgeen
Matosgeen
Vargasgeen
Zlotkey0.2
Abel0.3
Taylor0.2
Grant0.15
Whalengeen
Hartsteingeen
Faygeen
Higginsgeen
Gietzgeen

Maar COALESCE kan nog net iets meer. Bekijk onderstaand resultaat. Bij COALESCE geef je een rijtje op dat gecontroleerd moet worden. Het gaat er om wat er in de laatste kolom getoond moet worden. Als de eerste kolom (bonus) inhoud heeft, toon je die inhoud in de laatste kolom. Als de eerste kolom NULL is, kijk je naar de tweede kolom (department_id). Als die inhoud heeft, toon je die inhoud in de laatste kolom. Als zowel de eerste (bonus) als de tweede kolom (department_id) NULL zijn, toon je de tekst 'geen'.

SELECT last_name,
bonus,
department_id,
COALESCE(bonus, department_id, 'geen') AS comm
FROM employees;
last_namebonusdepartment_idcomm
KingNULL9090
KochharNULL9090
De HaanNULL9090
HunoldNULL6060
ErnstNULL6060
LorentzNULL6060
MourgosNULL5050
RajsNULL5050
DaviesNULL5050
MatosNULL5050
VargasNULL5050
Zlotkey1500801500
Abel1700801700
Taylor1250801250
GrantNULLNULLgeen
WhalenNULL1010
HartsteinNULL2020
FayNULL2020
HigginsNULL110110
GietzNULL110110

Je kunt een onbeperkt aantal kolommen gebruiken bij COALESCE. Nog een voorbeeld:

  • Als de kolom bonus gevuld is, wordt bonus getoond. Zie Zlotkey, Abel en Taylor.
  • Als bonus NULL is en commission_pct is gevuld, dan wordt commission_pct getoond. Zie Grant.
  • Als bonus en commission_pct NULL zijn, dan wordt het manager_id getoond. Zie alle overige personeelsleden behalve King.
  • Als bonus, commission_pct en manager_id NULL zijn, dan wordt de tekst 'geen' getoond. Zie King.
SELECT last_name,
COALESCE(bonus, commission_pct, manager_id, 'geen') AS comm
FROM employees;
last_namecomm
Kinggeen
Kochhar100
De Haan100
Hunold102
Ernst103
Lorentz103
Mourgos100
Rajs124
Davies124
Matos124
Vargas124
Zlotkey1500
Abel1700
Taylor1250
Grant0.15
Whalen101
Hartstein100
Fay201
Higgins101
Gietz205