W SQL Server COALESCE() wyrażenie zwraca swój pierwszy niepusty argument.
Działa to tak, że przekazujemy listę argumentów do wyrażenia, ocenia argumenty w kolejności i zwraca bieżącą wartość pierwszego wyrażenia, które początkowo nie ma wartości NULL .
Składnia
Składnia wygląda tak:
COALESCE ( expression [ ,...n ] ) Przykład
Oto prosty przykład do zademonstrowania:
SELECT COALESCE(null, 'Cat', 'Dog'); Wynik:
Cat
W tym przypadku Cat był pierwszym argumentem innym niż NULL, więc COALESCE() zwrócił tę wartość.
Wyrażenia
Jak wspomniano, COALESCE() zwraca bieżącą wartość pierwszego wyrażenia, które początkowo nie jest oceniane jako NULL . Dlatego jeśli przekażemy takie wyrażenie:
SELECT COALESCE( null, 2 * 3 ); Otrzymujemy to:
6
Funkcja zwraca typ danych wyrażenia o najwyższym priorytecie typu danych. Jeśli wszystkie wyrażenia nie dopuszczają wartości null, wynik jest zapisywany jako nie dopuszczający wartości null.
Kiedy wszystkie argumenty są NULL
Jeśli wszystkie argumenty są NULL , COALESCE() zwraca NULL . Jednak co najmniej jedna z wartości null musi być wpisana jako NULL , w przeciwnym razie wystąpi błąd.
Innymi słowy, nie wszystkie mogą być NULL stała:
SELECT COALESCE( null, null ); Otrzymujemy to:
Msg 4127, Level 16, State 1, Line 1 At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
W tym przypadku wszystkie argumenty miały wartość NULL stała, więc został zwrócony błąd.
Poniżej znajduje się przykład bazy danych pokazujący scenariusz, w którym COALESCE() zwraca NULL gdy wszystkie argumenty są NULL .
Załóżmy, że uruchamiamy następujące zapytanie:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Wynik:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Obie kolumny zawierają NULL wartości.
Więc jeśli przekażemy obie kolumny do COALESCE() , otrzymujemy wynik NULL :
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Wynik:
NULL
To samo dotyczy sytuacji, gdy jedną z kolumn zastąpimy znakiem NULL stała:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Wynik:
NULL
Czyli tylko wtedy, gdy wszystkie argumentami są NULL stałe, że otrzymujemy błąd.
Zastąp NULL Wyniki o znanej wartości
Możemy dołączyć znaną wartość jako ostatni argument, aby zastąpić dowolne wyniki NULL tą znaną wartością.
Na przykład poniższe zapytanie zwraca NULL :
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals; Wynik:
NULL
W tym przypadku UnitPrice kolumna zawiera wartości NULL we wszystkich wierszach, więc wynikiem było NULL .
Możemy użyć COALESCE() tak:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals; Wynik:
0.00
Teraz wynik NULL jest zastępowany znaną wartością (zero).
COALESCE() vs CASE
COALESCE() wyrażenie jest w rzeczywistości skrótem składniowym dla CASE wyrażenie. Kiedy używamy COALESCE() wyrażenie, optymalizator zapytania przepisuje je jako CASE wyrażenie.
Kiedy uruchamiam następujące oświadczenie:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Optymalizator zapytań przepisuje je w następujący sposób:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END COALESCE() vs ISNULL()
W pewnym sensie COALESCE() wyrażenie jest podobne do ISNULL() funkcjonować. Ale są różnice. W szczególności:
ISNULL()jest funkcją i jest oceniana tylko raz.COALESCE()z drugiej strony jest wyrażeniem i potencjalnie może być oceniany wiele razy.- Określanie typu danych wynikowego wyrażenia jest inne.
ISNULLużywa typu danych pierwszego parametru,COALESCEnastępuje poCASEreguły wyrażenia i zwraca typ danych o najwyższym priorytecie. - Zdolność NULL wyrażenia wynikowego jest inna dla
ISNULLiCOALESCE.ISNULLwartość zwracana jest zawsze uważana za NIE dopuszczającą wartości NULL (zakładając, że wartość zwracana jest wartością nie dopuszczającą wartości null). NatomiastCOALESCEz parametrami innymi niż null jest uważany zaNULL. - Walidacje dla
ISNULLiCOALESCEsą też inne. Na przykładNULLwartość dlaISNULLjest konwertowany naintchociaż dlaCOALESCE, musisz podać typ danych. ISNULLprzyjmuje tylko dwa parametry. NatomiastCOALESCEprzyjmuje zmienną liczbę parametrów.
Więcej informacji
Zobacz dokumentację Microsoft, aby uzyskać więcej szczegółów i bardziej złożone przykłady.