wake-up-neo.com

COALESCE-Funktion in SQL

Kann jemand erklären, wie die COALESCE-Funktion in SQL funktioniert? Die Syntax lautet wie folgt

Das MSDN-Dokument zu dieser Funktion ist ziemlich vage

The MSDN document on this function is pretty vague

104
Lloyd Banks

Mir wurde gesagt, dass COALESCE weniger kostspielig ist als ISNULL, aber Forschungsergebnisse deuten nicht darauf hin. ISNULL benötigt nur zwei Parameter, das Feld, das 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/

72
Bill Melius

Ich bin nicht sicher, warum Sie denken, dass die Dokumentation vage ist.

Es durchläuft einfach alle Parameter nacheinander und gibt den ersten zurück, der NOT NULL ist.

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 fast beliebig viele Parameter, aber sie sollten den gleichen Datentyp haben. (Wenn es sich nicht um denselben Datentyp handelt, werden sie implizit in einen geeigneten Datentyp umgewandelt, wobei Datentyprangfolge verwendet wird.)

Es ist wie ISNULL(), aber für mehrere Parameter anstatt nur zwei.

Es ist auch ANSI-SQL, wohin als ISNULL() nicht.

206
MatBailie

So sehe ich COALESCE ... und hoffentlich macht es Sinn ...

In vereinfachter Form….

Koalesze (Feldname, 'leer')

Dies bedeutet also: Wenn "FieldName" NULL ist, füllen Sie den Feldwert mit dem Wort "LEER" auf.

Nun zu mehreren Werten ...

Koalesze (FieldName1, FieldName2, Value2, Value3)

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 Beispieldatenbank AdventureWorks2012 funktioniert einwandfrei und gibt eine gute visuelle Erklärung, wie COALESCE funktioniert:

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
17
John Waclawski

Es ist viel mehr als nur ein Ersatz für ISNULL. Ich stimme völlig zu, dass die offizielle "Dokumentation" der Vereinigung unbestimmt und wenig hilfreich ist. Dieser Artikel hilft sehr. http://www.mssqltips.com/sqlservertip/1521/der-many-uses-of-coalesce-in-sql-server/

3
CindyPsych

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

  • braucht mindestens zwei Argumente.
  • argumente müssen vom ganzzahligen Typ sein.
  • das erste Nicht-Null-Argument zurückgeben.

z.B. 

  • eine Vereinigung (Null, 1, 2, 3) gibt 1 zurück.
  • coalesce (null, null) gibt null zurück.
2
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
0
Xiao

Einfachste Definition der Coalesce () - Funktion könnte sein:

Die Coalesce () - Funktion wertet alle übergebenen Argumente aus und gibt dann den Wert der ersten Instanz des Arguments zurück, die nicht als NULL ausgewertet wurde.

Hinweis: Es werden ALLE Parameter ausgewertet, d. H. Die Bewertung der Argumente auf der rechten Seite des zurückgegebenen Parameters/NOT NULL wird nicht übersprungen.

Syntax:

Coalesce(arg1, arg2, argN...)

Beware: Mit Ausnahme der Argumente, die mit NULL ausgewertet werden, müssen alle anderen (NOT-NULL) übergebenen Argumente entweder denselben Datentyp haben oder Matching-Typesimplizit automatisch in einen kompatiblen Datentyp konvertiert), 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 into VARCHAR occurs.

--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt)      --ERROR: passed args are NOT matching type

HTH

0
Eddie Kumar