Die meisten großen RDBMSs unterstützen COALESCE()
-Operator, der den ersten Nicht-Null-Wert aus seiner Argumentliste zurückgibt.
COALESCE()
ist eine SQL-Standardfunktion (in der ISO/IEC 9075-Spezifikation enthalten).
Syntax
Die Syntax lautet wie folgt:
COALESCE (V1, V2, ..., Vn)
Daher ist mindestens ein Argument erforderlich, es können jedoch mehrere Argumente angegeben werden (und werden dies normalerweise auch getan).
COALESCE()
wird als n angesehen -adischer Operator. Mit anderen Worten, es ist ein Operator, der eine variable Anzahl von Operanden hat (d. h. n Operanden).
Beispiel
Hier ist ein einfaches Beispiel zur Veranschaulichung:
SELECT COALESCE(null, 'Papaya', 'Salad');
Ergebnis:
Papaya
In diesem Fall Papaya
war der erste Nicht-Null-Wert, also COALESCE()
diesen Wert zurückgegeben.
Salad
war ebenfalls ein Nicht-Null-Wert, kam aber nach Papaya
und so wurde es nicht zurückgegeben.
COALESCE()
vs. CASE
COALESCE()
wird normalerweise als syntaktische Abkürzung für CASE
angesehen Ausdruck.
Daher die folgende Anweisung:
COALESCE (V1, V2)
entspricht:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
Und die folgende Anweisung:
COALESCE (V1, V2, ..., Vn)
(für n ≥ 3) Entspricht:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END
Wenn alle Werte Null sind
Wenn alle Werte null
sind , COALESCE()
gibt null
zurück :
SELECT COALESCE( null, null );
Ergebnis:
null
Abhängig von Ihrem RDBMS kann die tatsächliche Ausgabe für Nullwerte unterschiedlich sein. Beispielsweise wird bei der Verwendung von psql (für PostgreSQL) standardmäßig immer dann der leere String ausgegeben, wenn ein Nullwert zurückgegeben wird (dies kann jedoch geändert werden). Dasselbe gilt für SQLite (und das kann auch geändert werden).
In SQL Server, wenn alle Argumente null
sind , dann muss mindestens einer der Nullwerte ein typisierter null
sein . Daher führt das obige Beispiel tatsächlich zu einem Fehler (weil alle Nullargumente null
sind Konstanten).
Ausdrücke
COALESCE()
gibt den aktuellen Wert des ersten Ausdrucks zurück, der anfänglich nicht zu null
ausgewertet wird . Wenn wir also einen Ausdruck wie diesen übergeben:
SELECT COALESCE( null, 3 * 5 );
Wir bekommen das:
15
Datenbankbeispiel
Angenommen, wir führen die folgende Abfrage aus:
SELECT
name,
salary
FROM employee;
Und wir erhalten das folgende Ergebnis:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | null
Wir können sehen, dass die letzte Zeile im DOB
einen Nullwert hat Säule.
Wenn wir den Nullwert durch einen anderen Wert ersetzen wollten, könnten wir COALESCE()
verwenden wie folgt:
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Ergebnis:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
In diesem Fall haben wir alle Nullwerte durch die Ganzzahl 0
ersetzt .
Unterschiede zwischen RDBMSs
Im Allgemeinen COALESCE()
funktioniert in allen RDBMSs ziemlich gleich.
Aber es gibt einige Unterschiede.
Datentypen
Wir können Folgendes in MySQL, MariaDB und SQLite tun:
SELECT
name,
COALESCE(salary, 'None') AS salary
FROM employee;
Ergebnis:
name salary ----- ------ Elise 100000 Rohit 50000 Homer None
In diesem Fall immer dann, wenn das salary
Spalte einen Nullwert enthält, ist die Ausgabe None
.
Diese Abfrage kann jedoch Probleme in SQL Server, PostgreSQL oder Oracle Database verursachen.
Wenn ich diese Abfrage in SQL Server, PostgreSQL und Oracle Database ausführe, erhalte ich eine Fehlermeldung, weil der Ersatzwert den falschen Datentyp hat.
Folgendes gibt SQL Server zurück, wenn ich die obige Abfrage ausführe:
Msg 245, Level 16, State 1, Line 15 Conversion failed when converting the varchar value 'None' to data type int.
Folgendes gibt PostgreSQL zurück:
ERROR: invalid input syntax for type integer: "None" LINE 3: COALESCE(salary, 'None') AS salary ^
Und hier ist, was Oracle Database zurückgibt:
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
Aber wenn ich einen numerischen Wert verwende, bekomme ich nicht den Fehler:
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Ergebnis:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
Dieses letzte Beispiel funktioniert also in allen sechs der oben genannten RDBMS.
Null-Argumente
Ein weiterer Unterschied zwischen der Verarbeitung von COALESCE()
durch RDBMS liegt darin, wie sie mit Nullargumenten umgehen.
Wie bereits erwähnt, in SQL Server, wenn alle Argumente null
sind , dann muss mindestens einer der Nullwerte ein typisierter null
sein . Mit anderen Worten, wenn alle Argumente zu COALESCE()
die Nullkonstante sind, erhalten wir einen Fehler. Dies ist bei anderen RDBMSs nicht der Fall, bei denen alle Argumente die Nullkonstante sein können und die Ausgabe null
ist anstelle eines Fehlers.