COALESCE-Funktion in TSQL

109

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

Lloyd Banks
quelle

Antworten:

74

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/

Bill Melius
quelle
6
Vorsicht vor der Verwendung 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 der COALESCEFall ist.
Kettenrad12
215

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.

MatBailie
quelle
4
+1 Zur Erläuterung der Priorität der Datentypen. Ich glaube, das ISNULLgibt einen Wert mit dem gleichen Datentyp wie der erste Parameter zurück
Lamak
5
Ihr letztes Codebeispiel sollte den Fehler "Mindestens eines der Argumente für COALESCE muss ein typisiertes NULL sein" enthalten. Quelle: sql-server-performance.com/2007/…
maqk
2
Die Dokumentation sagt viel aus und schafft es gleichzeitig, einen Wert von nahezu Null zu liefern. Gute Dokumente bieten ein einfaches Beispiel mit einem einfachen Ergebnis. Coalesce bewegt sich sofort in 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.
P.Brian.Mackey
1
Details zur
Priorität
18

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
John Waclawski
quelle
4

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/

CindyPsych
quelle
3
Der Artikel, auf den Sie verlinkt haben, ist äußerst irreführend (wie mehrere Personen, einschließlich des Autors, im Kommentarbereich darauf hinweisen). Alle netten Tricks, die er hervorhebt, können mit ISNULL anstelle von Coalesce ausgeführt werden.
Hobo Spider
3

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

  • nimmt mindestens zwei Argumente.
  • Argumente müssen vom Typ Integer sein.
  • Gibt das erste Nicht-Null-Argument zurück.

z.B

  • Koaleszenz (null, 1, 2, 3) gibt 1 zurück.
  • coalesce (null, null) gibt null zurück.
Neeraj Bansal
quelle
1

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

Eddie Kumar
quelle
0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str
Xiao
quelle
1
Ich fand das viel einfacher.
Xiao