De meeste grote RDBMS'en ondersteunen de COALESCE()
operator, die de eerste niet-null-waarde uit de lijst met argumenten retourneert.
COALESCE()
is een SQL-standaardfunctie (het is opgenomen in de ISO/IEC 9075-specificatie).
Syntaxis
De syntaxis gaat als volgt:
COALESCE (V1, V2, ..., Vn)
Er is dus ten minste één argument vereist, maar meerdere argumenten kunnen (en worden meestal) opgegeven.
COALESCE()
wordt beschouwd als een n -adische operator. Met andere woorden, het is een operator met een variabel aantal operanden (d.w.z. n operanden).
Voorbeeld
Hier is een eenvoudig voorbeeld om te demonstreren:
SELECT COALESCE(null, 'Papaya', 'Salad');
Resultaat:
Papaja
In dit geval Papaya
was de eerste niet-null-waarde, en dus COALESCE()
heeft die waarde geretourneerd.
Salad
was ook een niet-null-waarde, maar deze kwam na Papaya
en dus werd het niet teruggestuurd.
COALESCE()
vs CASE
COALESCE()
wordt doorgaans beschouwd als een syntactische snelkoppeling voor de CASE
uitdrukking.
Als zodanig de volgende verklaring:
COALESCE (V1, V2)
is gelijk aan:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
En de volgende verklaring:
COALESCE (V1, V2, ..., Vn)
(voor n ≥ 3) Is gelijk aan:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END
Als alle waarden Null zijn
Als alle waarden null
zijn , COALESCE()
retourneert null
:
SELECT COALESCE( null, null );
Resultaat:
null
Afhankelijk van uw RDBMS kan de werkelijke uitvoer voor null-waarden verschillen. Als u bijvoorbeeld psql (voor PostgreSQL) gebruikt, wordt de lege tekenreeks standaard uitgevoerd wanneer een null-waarde wordt geretourneerd (hoewel dit kan worden gewijzigd). Het is hetzelfde met SQLite (en dit kan ook worden gewijzigd).
In SQL Server, als alle argumenten null
zijn , dan moet ten minste één van de null-waarden een getypte null
. zijn . Daarom resulteert het bovenstaande voorbeeld in een fout (omdat alle null-argumenten null
zijn) constanten).
Uitdrukkingen
COALESCE()
geeft de huidige waarde terug van de eerste uitdrukking die aanvankelijk niet resulteert in null
. Daarom, als we een uitdrukking als deze doorgeven:
SELECT COALESCE( null, 3 * 5 );
We krijgen dit:
15
Databasevoorbeeld
Stel dat we de volgende query uitvoeren:
SELECT
name,
salary
FROM employee;
En we krijgen het volgende resultaat:
We kunnen zien dat de laatste rij een null-waarde heeft in de DOB
kolom.
Als we de null-waarde willen vervangen door een andere waarde, kunnen we COALESCE()
gebruiken als volgt:
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Resultaat:
In dit geval hebben we alle null-waarden vervangen door het gehele getal 0
.
Verschillen tussen RDBMS'en
In het algemeen COALESCE()
werkt vrijwel hetzelfde over RDBMS'en.
Maar er zijn enkele verschillen.
Gegevenstypen
We kunnen het volgende doen in MySQL, MariaDB en SQLite:
SELECT
name,
COALESCE(salary, 'None') AS salary
FROM employee;
Resultaat:
naam salaris----- ------Elise 100000Rohit 50000Homer Geen
In dit geval, wanneer het salary
kolom een null-waarde bevat, is de uitvoer None
.
Maar die query kan problemen veroorzaken in SQL Server, PostgreSQL of Oracle Database.
Wanneer ik die query uitvoer in SQL Server, PostgreSQL en Oracle Database, krijg ik een foutmelding omdat de vervangende waarde het verkeerde gegevenstype is.
Dit is wat SQL Server retourneert als ik de bovenstaande query uitvoer:
Msg 245, Level 16, State 1, Line 15Conversie mislukt bij het converteren van de varchar-waarde 'None' naar datatype int.
Dit is wat PostgreSQL retourneert:
ERROR:ongeldige invoersyntaxis voor type geheel getal:"None"LINE 3:COALESCE(salary, 'None') AS salaris ^
En dit is wat Oracle Database retourneert:
ORA-00932:inconsistente datatypes:verwacht NUMBER kreeg CHAR
Maar als ik een numerieke waarde gebruik, krijg ik de fout niet:
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Resultaat:
Dus dit laatste voorbeeld werkt voor alle zes de bovenstaande RDBMS'en.
Nullargumenten
Nog een verschil tussen hoe RDBMS'en COALESCE()
verwerken zit in hoe ze omgaan met nulargumenten.
Zoals vermeld, in SQL Server, als alle argumenten null
zijn , dan moet ten minste één van de null-waarden een getypte null
. zijn . Met andere woorden, als alle argumenten voor COALESCE()
zijn de nulconstante, dan krijgen we een fout. Dit is niet het geval bij andere RDBMS'en, waar alle argumenten de nulconstante kunnen zijn en de uitvoer null
zal zijn in plaats van een fout.