Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server COALESCE() erklärt

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 dem CASE 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 und COALESCE . Der ISNULL Der Rückgabewert wird immer als NICHT NULL-fähig betrachtet (vorausgesetzt, der Rückgabewert ist ein Nicht-Null-Wert). Im Gegensatz dazu COALESCE mit Nicht-Null-Parametern wird als NULL betrachtet .
  • Validierungen für ISNULL und COALESCE sind auch anders. Zum Beispiel ein NULL Wert für ISNULL wird in int umgewandelt allerdings für COALESCE , müssen Sie einen Datentyp angeben.
  • ISNULL nimmt nur zwei Parameter. Im Gegensatz dazu COALESCE nimmt eine variable Anzahl von Parametern.

Weitere Informationen

Weitere Einzelheiten und komplexere Beispiele finden Sie in der Dokumentation von Microsoft.