Funkcja COALESCE w TSQL

109

Czy ktoś może wyjaśnić, jak działa funkcja COALESCE w TSQL? Składnia jest następująca

COALESCE (x, y)

Dokument MSDN dotyczący tej funkcji jest dość niejasny

Lloyd Banks
źródło

Odpowiedzi:

74

Powiedziano mi, że COALESCE jest mniej kosztowny niż ISNULL, ale badania tego nie wskazują. ISNULL przyjmuje tylko dwa parametry, pole jest oceniane jako NULL i żądany wynik, jeśli jest oceniany jako NULL. COALESCE przyjmie dowolną liczbę parametrów i zwróci pierwszą napotkaną wartość, która nie jest NULL.

Dokładniejszy opis szczegółów znajduje się tutaj http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/

Bill Melius
źródło
6
Uważaj na używanie ISNULL, nie jest to standardowe, mniej elastyczne, czytałem, że zawsze zwróci typ danych pierwszego argumentu, a nie typ danych zwracanej wartości, jak COALESCErobi.
sprocket12
215

Nie jestem pewien, dlaczego uważasz, że dokumentacja jest niejasna.

Po prostu przechodzi przez wszystkie parametry jeden po drugim i zwraca pierwszy, czyli pierwszy 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

Akceptuje prawie dowolną liczbę parametrów, ale powinny one być tego samego typu danych. (Jeśli nie są tego samego typu danych, są niejawnie rzutowane na odpowiedni typ danych przy użyciu kolejności pierwszeństwa typów danych ).

To tak, ISNULL()ale dla wielu parametrów, a nie tylko dwóch.

Jest także ANSI-SQL, gdzie-jak ISNULL()nie jest.

MatBailie
źródło
4
+1 Wyjaśnienie dotyczące pierwszeństwa typów danych. Uważam jednak, że ISNULLzwraca wartość z tym samym typem danych co pierwszy parametr
Lamak
5
Twój ostatni przykład kodu powinien zawierać błąd „Co najmniej jeden z argumentów COALESCE musi być wpisany jako NULL” Źródło: sql-server-performance.com/2007/…
maqk
2
Dokumentacja wiele mówi, a jednocześnie zapewnia prawie zerową wartość. Dobra dokumentacja dostarcza prostego przykładu z prostym wynikiem. Coalesce natychmiast przechodzi do expressions, porównania z CASE, porównania z ISNULL i wreszcie przykład bez wyniku. Następnie zbyt złożony przykład ze zbyt dużą liczbą szczegółów. Kiedy potrzebujemy tylko tej odpowiedzi z 5 - 6 liniami WTF, to jest i robi.
P.Brian.Mackey
18

Oto sposób, w jaki patrzę na COALESCE ... i mam nadzieję, że ma to sens ...

W uproszczonej formie….

Coalesce (FieldName, „Empty”)

To przekłada się na… Jeśli „FieldName” ma wartość NULL, wypełnij wartość pola słowem „EMPTY”.

Teraz dla wielu wartości ...

Coalesce (FieldName1, FieldName2, Value2, Value3)

Jeśli wartość w polu Fieldname1 jest null, wypełnij ją wartością z pola Fieldname2, jeśli FieldName2 ma wartość NULL, wypełnij ją wartością2 itd.

Ten fragment kodu testowego dla przykładowej bazy danych AdventureWorks2012 działa doskonale i daje dobre wizualne wyjaśnienie, jak działa COALESCE :

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
John Wacławski
źródło
4

Jest dużo więcej do połączenia niż tylko zamiennik ISNULL. Całkowicie się zgadzam, że oficjalna „dokumentacja” koalescencji jest niejasna i nieprzydatna. Ten artykuł bardzo pomaga. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/

CindyPsych
źródło
3
Ten artykuł, do którego utworzyłeś link, jest wyjątkowo mylący (na co zwraca uwagę kilka osób, w tym autor, w sekcji komentarzy). Wszystkie schludne sztuczki, które podkreśla, WSZYSTKIE można wykonać za pomocą ISNULL zamiast łączenia.
Hobo Spider
3

Oto proste zapytanie zawierające coalesce -

select * from person where coalesce(addressId, ContactId) is null.

Zwróci osoby, w których zarówno addressId, jak i contactId są puste.

funkcja koalescencji

  • przyjmuje co najmniej dwa argumenty.
  • argumenty muszą być liczbami całkowitymi.
  • zwraca pierwszy niezerowy argument.

na przykład

  • coalesce (null, 1, 2, 3) zwróci 1.
  • coalesce (null, null) zwróci wartość null.
Neeraj Bansal
źródło
1

Najprostszą definicją funkcji Coalesce () może być:

Funkcja Coalesce () oblicza wszystkie przekazane argumenty, a następnie zwraca wartość pierwszego wystąpienia argumentu, który nie został oceniony na NULL.

Uwaga: oblicza WSZYSTKIE parametry, tj. Nie pomija oceny argumentów po prawej stronie zwracanego parametru / NOT NULL.

Składnia:

Coalesce(arg1, arg2, argN...)

Uwaga : poza argumentami, których wynikiem jest NULL, wszystkie inne (NOT-NULL) argumenty muszą być albo tego samego typu danych, albo muszą mieć pasujące typy (które mogą być „niejawnie automatycznie konwertowane” na zgodny typ danych), zobacz przykłady poniżej:

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
źródło
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
źródło
1
Odkryłem, że ten jest znacznie prostszy.
Xiao