case versus isnull versus coalesce

9

Ich habe gerade die Dokumentation für die SQL Server 2012-Prüfungen gelesen und den folgenden Punkt gesehen:

case versus isnull versus coalesce

Jetzt weiß ich , WIE jeden verwenden , aber ich weiß nicht , WENN jedes zu verwenden. Bitte könnte ein Körper klarstellen. Vielen Dank.

Ps. Könnten wir bitte einen Tag für Prüfungsfragen haben?

Stuart Blackler
quelle
2
COALESCEwird erweitert, CASEaber offensichtlich können Sie in einer CASEErklärung, die Sie selbst schreiben, flexibler in den WHENBedingungen sein. Für ISNULLvs COALESCE verwandt / duplizieren?
Martin Smith
verwandt stimme ich zu. aber nicht dup. Danke für den Kommentar :)
Stuart Blackler

Antworten:

10

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.

billinkc
quelle
Vielen Dank für die vollständige Antwort so schnell. Ich hatte keine Ahnung, dass die Rangfolge wichtig war COALESCE.
Nochmals
1
CASEist technisch gesehen ein Ausdruck, keine Funktion.
Ypercubeᵀᴹ
1

ISNULL gibt Ihnen die Möglichkeit, 1 Wiederholung zurückzugeben. COALESCE ist nicht auf einen Wert beschränkt. COALESCE(v1,v2,v3,v4,v5) Wenn beispielsweise V5 der einzige Wert ist, der NICHT NULL ist, wird er zurückgegeben

bummi
quelle