In SQL Server das COALESCE()
Ausdruck gibt sein erstes Nicht-Null-Argument zurück.
So funktioniert es:Wir übergeben eine Liste von Argumenten an den Ausdruck, er wertet die Argumente der Reihe nach aus und gibt den aktuellen Wert des ersten Ausdrucks zurück, der anfänglich nicht zu NULL
ausgewertet wird .
Syntax
Die Syntax lautet wie folgt:
COALESCE ( expression [ ,...n ] )
Beispiel
Hier ist ein einfaches Beispiel zur Veranschaulichung:
SELECT COALESCE(null, 'Cat', 'Dog');
Ergebnis:
Cat
In diesem Fall Cat
war das erste Nicht-NULL-Argument, also COALESCE()
diesen Wert zurückgegeben.
Ausdrücke
Wie bereits erwähnt, COALESCE()
gibt den aktuellen Wert zurück des ersten Ausdrucks, der anfänglich nicht zu NULL
ausgewertet wird . Wenn wir also einen Ausdruck wie diesen übergeben:
SELECT COALESCE( null, 2 * 3 );
Wir bekommen das:
6
Die Funktion gibt den Datentyp des Ausdrucks mit der höchsten Datentyppriorität zurück. Wenn alle Ausdrücke nicht-nullable sind, wird das Ergebnis als nicht-nullable typisiert.
Wenn alle Argumente NULL sind
Wenn alle Argumente NULL
sind , COALESCE()
gibt NULL
zurück . Mindestens einer der Nullwerte muss jedoch ein typisierter NULL
sein , andernfalls tritt ein Fehler auf.
Mit anderen Worten, sie können nicht alle NULL
sein Konstante:
SELECT COALESCE( null, null );
Wir bekommen das:
Msg 4127, Level 16, State 1, Line 1 At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
In diesem Fall waren alle Argumente NULL
konstant, daher wurde ein Fehler zurückgegeben.
Unten ist ein Datenbankbeispiel, um ein Szenario zu demonstrieren, in dem COALESCE()
gibt NULL
zurück wenn alle Argumente NULL
sind .
Angenommen, wir führen die folgende Abfrage aus:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Ergebnis:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Beide Spalten enthalten NULL
Werte.
Übergeben wir also beide Spalten an COALESCE()
, erhalten wir als Ergebnis NULL
:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Ergebnis:
NULL
Dasselbe gilt, wenn wir eine der Spalten durch NULL
ersetzen Konstante:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Ergebnis:
NULL
Also nur wenn alle Argumente sind NULL
konstant, dass wir einen Fehler erhalten.
Ersetzen Sie NULL
Ergebnisse mit bekanntem Wert
Wir können einen bekannten Wert als letztes Argument einfügen, um alle NULL-Ergebnisse durch diesen bekannten Wert zu ersetzen.
Die folgende Abfrage gibt beispielsweise NULL
zurück :
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals;
Ergebnis:
NULL
In diesem Fall der UnitPrice
Spalte enthält NULL-Werte in allen Zeilen, und daher war das Ergebnis NULL
.
Wir können COALESCE()
verwenden so:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;
Ergebnis:
0.00
Jetzt wird das NULL-Ergebnis durch einen bekannten Wert (Null) ersetzt.
COALESCE()
vs. CASE
Das COALESCE()
Ausdruck ist eigentlich eine syntaktische Abkürzung für CASE
Ausdruck. Wenn wir COALESCE()
verwenden Ausdruck, der Abfrageoptimierer schreibt ihn als CASE
um Ausdruck.
Wenn ich die folgende Anweisung ausführe:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
Der Abfrageoptimierer schreibt es wie folgt um:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END
COALESCE()
vs ISNULL()
In gewisser Weise ist das COALESCE()
Ausdruck ist ähnlich dem ISNULL()
Funktion. Aber es gibt Unterschiede. Insbesondere:
ISNULL()
ist eine Funktion und wird nur einmal ausgewertet.COALESCE()
andererseits ist ein Ausdruck und kann möglicherweise mehrfach ausgewertet werden.- Die Datentypbestimmung des resultierenden Ausdrucks ist anders.
ISNULL
verwendet den Datentyp des ersten Parameters,COALESCE
folgt demCASE
Ausdrucksregeln und gibt den Datentyp des Werts mit der höchsten Priorität zurück. - Die NULL-Zulässigkeit des Ergebnisausdrucks ist für
ISNULL
anders undCOALESCE
. DerISNULL
Der Rückgabewert wird immer als NICHT NULL-fähig betrachtet (vorausgesetzt, der Rückgabewert ist ein Nicht-Null-Wert). Im Gegensatz dazuCOALESCE
mit Nicht-Null-Parametern wird alsNULL
betrachtet . - Validierungen für
ISNULL
undCOALESCE
sind auch anders. Zum Beispiel einNULL
Wert fürISNULL
wird inint
umgewandelt allerdings fürCOALESCE
, müssen Sie einen Datentyp angeben. ISNULL
nimmt nur zwei Parameter. Im Gegensatz dazuCOALESCE
nimmt eine variable Anzahl von Parametern.
Weitere Informationen
Weitere Einzelheiten und komplexere Beispiele finden Sie in der Dokumentation von Microsoft.