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

SQL - Unterschied zwischen COALESCE und ISNULL?

Vergleich von COALESCE und ISNULL

Die ISNULL-Funktion und der COALESCE-Ausdruck haben einen ähnlichen Zweck, können sich aber unterschiedlich verhalten.

  1. Da ISNULL eine Funktion ist, wird sie nur einmal ausgewertet. Wie oben beschrieben, können die Eingabewerte für den COALESCE-Ausdruck mehrfach ausgewertet werden.
  2. Die Datentypbestimmung des resultierenden Ausdrucks ist unterschiedlich. ISNULL verwendet den Datentyp des ersten Parameters, COALESCE folgt den CASE-Ausdrucksregeln und gibt den Datentyp von value mit der höchsten Priorität zurück.
  3. Die NULL-Zulässigkeit des Ergebnisausdrucks ist für ISNULL und COALESCE unterschiedlich. Der ISNULL-Rückgabewert wird immer als NICHT NULL-fähig betrachtet (vorausgesetzt, der Rückgabewert ist ein nicht-nullfähiger Wert), wohingegen COALESCE mit Nicht-Null-Parametern als NULL betrachtet wird. Die Ausdrücke ISNULL(NULL, 1) und COALESCE(NULL, 1) haben also, obwohl sie gleichwertig sind, unterschiedliche Nullwerte. Dies macht einen Unterschied, wenn Sie diese Ausdrücke in berechneten Spalten verwenden, Schlüsseleinschränkungen erstellen oder den Rückgabewert einer skalaren UDF deterministisch machen, sodass sie wie im folgenden Beispiel indiziert werden kann.
> USE tempdb; 
> GO

> -- This statement fails because the PRIMARY KEY cannot accept NULL values
> -- and the nullability of the COALESCE expression for col2 
> -- evaluates to NULL. 

> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0) PRIMARY KEY,  col3 AS ISNULL(col1, 0)  ); 
> 
> -- This statement succeeds because the nullability of the 
> -- ISNULL function evaluates AS NOT NULL.
> 
> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0), 
> col3 AS ISNULL(col1, 0) PRIMARY KEY  );

Validierungen für ISNULL und COALESCE sind ebenfalls unterschiedlich. Beispielsweise wird ein NULL-Wert für ISNULL in int konvertiert, während Sie für COALESCE einen Datentyp angeben müssen. ISNULL nimmt nur 2 Parameter, während COALESCE eine variable Anzahl von Parametern akzeptiert.

Quelle:BOL