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.
ISNULLverwendet den Datentyp des ersten Parameters,COALESCEfolgt demCASEAusdrucksregeln und gibt den Datentyp des Werts mit der höchsten Priorität zurück. - Die NULL-Zulässigkeit des Ergebnisausdrucks ist für
ISNULLanders undCOALESCE. DerISNULLDer Rückgabewert wird immer als NICHT NULL-fähig betrachtet (vorausgesetzt, der Rückgabewert ist ein Nicht-Null-Wert). Im Gegensatz dazuCOALESCEmit Nicht-Null-Parametern wird alsNULLbetrachtet . - Validierungen für
ISNULLundCOALESCEsind auch anders. Zum Beispiel einNULLWert fürISNULLwird inintumgewandelt allerdings fürCOALESCE, müssen Sie einen Datentyp angeben. ISNULLnimmt nur zwei Parameter. Im Gegensatz dazuCOALESCEnimmt eine variable Anzahl von Parametern.
Weitere Informationen
Weitere Einzelheiten und komplexere Beispiele finden Sie in der Dokumentation von Microsoft.