ISNULL - nur in SQL Server verfügbar. Ermöglicht das Testen und Ersetzen eines NULL-Werts untereinander.
COALESCE - ANSI-Standard. Ermöglicht das Testen und Ersetzen eines NULL-Werts durch den ersten Nicht-Null-Wert in einer Reihe von Argumenten variabler Länge. Es ist wichtig zu beachten, dass der Datentyp Vorrang hat
-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1)
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')
Im obigen Beispiel ist 'a' der erste Wert ungleich Null, aber Zeichendaten haben eine niedrigere Priorität als Ganzzahlen.
Eine weitere Überlegung zwischen ISNULL und COALESCE ist, dass das Ergebnis von ISNULL als NICHT NULL bestimmt wird, während das Ergebnis eines COALESCE-Aufrufs NULL ist. Siehe JRJs Beitrag ISNULL () <> COALESCE () Während dies trivial erscheinen mag, kann das Abfrageoptimierungsprogramm basierend auf der Nullfähigkeit einer Spalte verschiedene Pläne erstellen.
Sie können die Nullfähigkeit Ihrer isnull / coalesce / case-Ausdrücke einfach testen, indem Sie sie über das dmo sys.dm_exec_describe_first_result_set ausführen
-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
DMO.*
FROM
sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO
CASE - Auch eine ANSI-Standard-Skalarfunktion. Ich würde mir überlegen, CASE gegenüber den beiden vorherigen zu verwenden, wenn ich einen Test habe, der nicht in einem einfachen Skalar ausgedrückt werden kann, aber das ist eine ziemlich schwache Antwort, gebe ich zu.
COALESCEwird erweitert,CASEaber offensichtlich können Sie in einerCASEErklärung, die Sie selbst schreiben, flexibler in denWHENBedingungen sein. FürISNULLvsCOALESCEverwandt / duplizieren?