Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server COALESCE() Objaśnienie

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 po CASE reguły wyrażenia i zwraca typ danych o najwyższym priorytecie.
  • Zdolność NULL wyrażenia wynikowego jest inna dla ISNULL i COALESCE . 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). Natomiast COALESCE z parametrami innymi niż null jest uważany za NULL .
  • Walidacje dla ISNULL i COALESCE są też inne. Na przykład NULL wartość dla ISNULL jest konwertowany na int chociaż dla COALESCE , musisz podać typ danych.
  • ISNULL przyjmuje tylko dwa parametry. Natomiast COALESCE przyjmuje zmienną liczbę parametrów.

Więcej informacji

Zobacz dokumentację Microsoft, aby uzyskać więcej szczegółów i bardziej złożone przykłady.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy klucz obcy automatycznie tworzy indeks?

  2. SPRAWDŹ Ograniczenia w SQL Server

  3. Część czasowa pola DateTime w SQL

  4. Dostosuj alarmy Spotlight Cloud

  5. Jak mogę pobrać listę parametrów z procedury składowanej w SQL Server?