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.
ISNULL
używa typu danych pierwszego parametru,COALESCE
następuje poCASE
reguły wyrażenia i zwraca typ danych o najwyższym priorytecie. - Zdolność NULL wyrażenia wynikowego jest inna dla
ISNULL
iCOALESCE
.ISNULL
wartość 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). NatomiastCOALESCE
z parametrami innymi niż null jest uważany zaNULL
. - Walidacje dla
ISNULL
iCOALESCE
są też inne. Na przykładNULL
wartość dlaISNULL
jest konwertowany naint
chociaż dlaCOALESCE
, musisz podać typ danych. ISNULL
przyjmuje tylko dwa parametry. NatomiastCOALESCE
przyjmuje zmienną liczbę parametrów.
Więcej informacji
Zobacz dokumentację Microsoft, aby uzyskać więcej szczegółów i bardziej złożone przykłady.