Cursus
Bij het werken met echte data zijn ontbrekende waarden bijna onvermijdelijk. Of je nu datasets opschoont of kolommen samenvoegt, SQL biedt een eenvoudige maar krachtige oplossing: de functie COALESCE(). In deze tutorial zie je hoe COALESCE() werkt, wanneer je het gebruikt en hoe je het toepast met praktische voorbeelden—allemaal in slechts een paar regels SQL.
Wat is COALESCE() in SQL?
De functie COALESCE() in SQL geeft de eerste niet-null waarde terug uit een lijst met expressies. Als alle waarden null zijn, retourneert het null. Het wordt vaak gebruikt om ontbrekende waarden af te handelen of meerdere kolommen te combineren tot één fallback-uitvoer.
Wanneer moet je COALESCE() gebruiken?
Deze functie is handig wanneer je waarden uit meerdere kolommen tot één wilt samenvoegen.
Stel dat een tabel met de naam users de waarden bevat voor de work_email en personal_email van gebruikers.
Met de functie COALESCE() kunnen we een kolom maken met de naam email, die de work_email van de gebruiker toont als die niet null is. Anders toont hij personal_email.
|
|
|
|
|
|
1 |
angel@datacamp.com |
null |
angel@datacamp.com |
|
2 |
null |
bruce@gmail.com |
bruce@gmail.com |
|
3 |
cath@datacamp.com |
cath@gmail.com |
cath@datacamp.com |
Syntax van COALESCE()
COALESCE(value_1, value_2, ...., value_n)
De functie COALESCE() neemt minimaal één waarde (value_1). Hij retourneert de eerste niet-null waarde in de lijst, van links naar rechts.
Zo wordt eerst gecontroleerd of value_1 null is. Zo niet, dan retourneert hij value_1. Anders wordt gecontroleerd of value_2 null is. Dit proces gaat door totdat de lijst is doorlopen.
COALESCE() kan worden gebruikt met kolommen, expressies of constanten.
Praktische voorbeelden van COALESCE()
Voer de code uit deze tutorial online uit en pas 'm aan.
Code uitvoerenVoorbeeld 1: null vervangen door een constante
Neem de tabel countries met een lijst van landen en hun nationale dagen. Sommige waarden voor nationale dag zijn null. COALESCE() vult ontbrekende waarden in national_day op met de constante string 'Unknown'.
SELECT
country_id,
name,
national_day,
COALESCE(national_day, 'Unknown') AS national_day_coalesced
FROM countries
ORDER BY country_id
De resultaten zijn als volgt:
|
|
|
|
|
|
1 |
Aruba |
null |
Unknown |
|
2 |
Afghanistan |
1919-08-19T00:00:00.000Z |
1919-08-19 |
|
3 |
Angola |
1975-11-11T00:00:00.000Z |
1975-11-11 |
|
4 |
Anguilla |
1967-05-30T00:00:00.000Z |
1967-05-30 |
Let op hoe de waarde null in national_day wordt vervangen door de constante Unknown.
Voorbeeld 2: kiezen tussen twee kolommen
We hebben een tabel met de naam products. Deze bevat de productnaam en de beschrijving. Sommige beschrijvingen zijn te lang (meer dan 60 tekens). In dat geval vervangen we de beschrijving door de productnaam.
De volgende query gebruikt CASE om lange beschrijvingen om te zetten naar NULL, en gebruikt vervolgens COALESCE() om terug te vallen op de productnaam.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE WHEN
LENGTH(description) >= 60
THEN NULL
ELSE description
END,
product_name) product_name_or_description
FROM products
De resultaten zijn als volgt:
product_name |
|
|
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:14Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:15Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
Asus X99-E-10G WS |
"CPU:LGA2011-3,Form Factor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
"CPU:LGA2011-3,Form Factor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
|
Supermicro X9SRH-7TF |
"CPU:LGA2011,Form Factor:ATX,RAM Slots:8,Max RAM:64GB" |
"CPU:LGA2011,Form Factor:ATX,RAM Slots:8,Max RAM:64GB" |
Let op hoe de kolom product_name_or_description de product_name toont als de description lang is. Anders toont hij de description.
Voorbeeld 3: fallback-logica met meerdere kolommen
We kunnen voorbeeld 2 nog een stap verder nemen. Ga uit van twee vereisten:
- Als de lengte van de
descriptionminder dan 60 is, toon dan dedescription. - Controleer anders of de lengte van de
product_nameminder dan 20 is. Zo ja, toon dan deproduct_name. - Toon anders
product.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE
WHEN LENGTH(description) > 50
THEN NULL
ELSE description
END,
CASE
WHEN LENGTH(product_name) > 14
THEN NULL
ELSE product_name
END,
'product') AS product_name_or_description
FROM products
ORDER BY product_name
De resultaten zijn als volgt:
|
|
|
|
|
ADATA ASU800SS-128GT-C |
Series:Ultimate SU800,Type:SSD,Capacity:128GB,Cache:N/A |
product |
|
ADATA ASU800SS-512GT-C |
Series:Ultimate SU800,Type:SSD,Capacity:512GB,Cache:N/A |
product |
|
AMD 100-5056062 |
Chipset:Vega Frontier Edition Liquid,Memory:16GBCore Clock:1.5GHz |
product |
|
AMD 100-505989 |
Chipset:FirePro W9100,Memory:32GBCore Clock:930MHz |
Chipset:FirePro W9100,Memory:32GBCore Clock:930MHz |
Let op hoe de kolom product_name_or_description afhankelijk van de lengtes van product_name of description óf de product_name óf de description toont.
Ondersteunde SQL-engines
COALESCE() werkt in SQL Server (vanaf 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse, BigQuery en Amazon RedShift.
Gerelateerde SQL-functies
Tot slot
De functie COALESCE() is een veelzijdige tool om null-waarden af te handelen en je SQL-queries te vereenvoudigen. Of je nu ontbrekende data vervangt door standaardwaarden of meerdere kolommen samenvoegt tot één, COALESCE() houdt je logica overzichtelijk en leesbaar.
Klaar om je SQL-skills te verdiepen? Bekijk deze toegankelijke en carrièreversterkende cursussen op DataCamp:
FAQs
Wat gebeurt er als alle waarden in COALESCE() NULL zijn?
Als elk argument dat aan de functie COALESCE() wordt doorgegeven NULL is, retourneert de functie NULL.
Hoe verschilt COALESCE() van ISNULL() of IFNULL()?
ISNULL()(SQL Server) enIFNULL()(MySQL, SQLite) accepteren slechts twee argumenten.-
COALESCE()kan meerdere argumenten accepteren en is standaarder over SQL-dialecten heen. -
COALESCE()maakt deel uit van de ANSI SQL-standaard, terwijlISNULL()enIFNULL()databasespecifiek zijn.
Kan ik COALESCE() gebruiken met expressies of functies?
Ja, je kunt kolomnamen, literalen, functies of expressies gebruiken binnen COALESCE().
COALESCE(LOWER(name), 'unknown')Zijn er prestatiekosten verbonden aan het gebruik van COALESCE()?
In het algemeen niet—COALESCE() is efficiënt. Maar als je het gebruikt met complexe expressies of binnen grote queries, kan de database meer expressies evalueren dan nodig, afhankelijk van hoe het is geschreven.
Werkt COALESCE() met verschillende datatypen?
Ja, maar alle argumenten moeten impliciet converteerbaar zijn naar een gemeenschappelijk datatype. Anders kan, afhankelijk van je SQL-engine, een typeconversiefout worden geretourneerd.
Kan ik COALESCE()-functies nesten?
Ja. Je kunt ze nesten, al is het zelden nodig omdat COALESCE() al meerdere argumenten afhandelt:
COALESCE(col1, COALESCE(col2, 'default'))
Dit is equivalent aan:
COALESCE(col1, col2, 'default')
