Kann jemand erklären, wie die COALESCE-Funktion in TSQL funktioniert? Die Syntax lautet wie folgt
COALESCE (x, y)
Das MSDN-Dokument zu dieser Funktion ist ziemlich vage
Kann jemand erklären, wie die COALESCE-Funktion in TSQL funktioniert? Die Syntax lautet wie folgt
COALESCE (x, y)
Das MSDN-Dokument zu dieser Funktion ist ziemlich vage
Antworten:
Mir wurde gesagt, dass COALESCE weniger kostspielig ist als ISNULL, aber die Forschung zeigt das nicht. ISNULL akzeptiert nur zwei Parameter, wobei das Feld für NULL ausgewertet wird und das gewünschte Ergebnis, wenn es als NULL ausgewertet wird. COALESCE akzeptiert eine beliebige Anzahl von Parametern und gibt den ersten gefundenen Wert zurück, der nicht NULL ist.
Eine ausführlichere Beschreibung der Details finden Sie hier http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
Ich bin mir nicht sicher, warum Sie die Dokumentation für vage halten.
Es geht einfach alle Parameter einzeln durch und gibt den ersten zurück NOT NULL
.
COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1
COALESCE(1, 2, 3, 4, 5, NULL)
=> 1
COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3
COALESCE(6, 5, 4, 3, 2, NULL)
=> 6
COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL
Es akzeptiert so ziemlich jede Anzahl von Parametern, aber sie sollten vom gleichen Datentyp sein. (Wenn sie nicht denselben Datentyp haben, werden sie implizit in einen geeigneten Datentyp umgewandelt, wobei die Rangfolge der Datentypen Vorrang hat .)
Es ist wie ISNULL()
für mehrere Parameter und nicht nur für zwei.
Es ist auch ANSI-SQL
, wo-wie ISNULL()
nicht.
ISNULL
gibt einen Wert mit dem gleichen Datentyp wie der erste Parameter zurück
expressions
, Vergleiche mit CASE, Vergleiche mit ISNULL und schließlich ein Beispiel ohne Ergebnis. Dann ein zu komplexes Beispiel mit zu vielen Details. Wenn wir nur diese Antwort mit 5 - 6 Zeilen WTF brauchen, ist und tut dies.
So sehe ich COALESCE ... und hoffentlich macht es Sinn ...
In einer vereinfachten Form….
Coalesce (Feldname, 'leer')
Das bedeutet also ... Wenn "FieldName" NULL ist, füllen Sie den Feldwert mit dem Wort "EMPTY".
Nun zu mehreren Werten ...
Zusammenführen (Feldname1, Feldname2, Wert2, Wert3)
Wenn der Wert in Feldname1 null ist, füllen Sie ihn mit dem Wert in Feldname2, wenn Feldname2 NULL ist, füllen Sie ihn mit Wert2 usw.
Dieser Testcode für die AdventureWorks2012- Beispieldatenbank funktioniert einwandfrei und bietet eine gute visuelle Erklärung der Funktionsweise von COALESCE :
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
Es gibt viel mehr zu verschmelzen als nur einen Ersatz für ISNULL. Ich stimme voll und ganz zu, dass die offizielle "Dokumentation" der Verschmelzung vage und nicht hilfreich ist. Dieser Artikel hilft sehr. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
Hier ist eine einfache Abfrage mit Coalesce -
select * from person where coalesce(addressId, ContactId) is null.
Es werden die Personen zurückgegeben, bei denen sowohl addressId als auch contactId null sind.
Koaleszenzfunktion
z.B
Die einfachste Definition der Coalesce () -Funktion könnte sein:
Die Funktion Coalesce () wertet alle übergebenen Argumente aus und gibt dann den Wert der ersten Instanz des Arguments zurück, das nicht als NULL ausgewertet wurde.
Hinweis: Es werden ALLE Parameter ausgewertet, dh die Auswertung der Argumente auf der rechten Seite des zurückgegebenen / NOT NULL-Parameters wird nicht übersprungen.
Syntax:
Coalesce(arg1, arg2, argN...)
Achtung : Abgesehen von den Argumenten, die als NULL ausgewertet werden, müssen alle anderen (NOT-NULL) Argumente entweder vom gleichen Datentyp oder vom passenden Typ sein (der "implizit automatisch in einen kompatiblen Datentyp konvertiert werden kann") (siehe Beispiele) unten:
PRINT COALESCE(NULL, ('str-'+'1'), 'x') --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3) --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99) --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.
DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31') --returns today's date, works fine as implicit conversion into DATE type occurs.
--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str') --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.
--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt) --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.
HTH
ISNULL
, es ist nicht Standard, weniger flexibel. Ich habe gelesen, dass es immer den Datentyp des ersten Arguments zurückgibt und nicht den Datentyp des zurückgegebenen Werts wie dies derCOALESCE
Fall ist.