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
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
Odpowiedzi:
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/
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.
ISNULL
zwraca wartość z tym samym typem danych co pierwszy parametr
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.
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
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/
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
na przykład
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
ISNULL
, nie jest to standardowe, mniej elastyczne, czytałem, że zawsze zwróci typ danych pierwszego argumentu, a nie typ danych zwracanej wartości, jakCOALESCE
robi.