Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server COALESCE() Обяснено

В SQL Server, COALESCE() изразът връща първия си ненулев аргумент.

Начинът, по който работи е, ние предаваме списък с аргументи към израза, той оценява аргументите по ред и връща текущата стойност на първия израз, който първоначално не се оценява на NULL .

Синтаксис

Синтаксисът е така:

COALESCE ( expression [ ,...n ] )

Пример

Ето един прост пример за демонстрация:

SELECT COALESCE(null, 'Cat', 'Dog');

Резултат:

Cat

В този случай Cat беше първият аргумент, различен от NULL, и така COALESCE() върна тази стойност.

Изрази

Както споменахме, COALESCE() връща текущата стойност от първия израз, който първоначално не се оценява на NULL . Следователно, ако предадем израз като този:

SELECT COALESCE( null, 2 * 3 );

Получаваме това:

6

Функцията връща типа данни на израза с най-висок приоритет на типа данни. Ако всички изрази не могат да бъдат нулирани, резултатът се въвежда като ненулеви.

Когато всички аргументи са NULL

Ако всички аргументи са NULL , COALESCE() връща NULL . Въпреки това, поне една от нулевите стойности трябва да бъде въведен NULL , в противен случай възниква грешка.

С други думи, не могат всички да бъдат NULL константа:

SELECT COALESCE( null, null );

Получаваме това:

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.

В този случай всички аргументи бяха NULL константа и така беше върната грешка.

По-долу е даден пример за база данни за демонстриране на сценарий, при който COALESCE() връща NULL когато всички аргументи са NULL .

Да предположим, че изпълняваме следната заявка:

SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Резултат:

CustomerId  CustomerCategoryId
----------- ------------------
NULL        NULL

И двете колони съдържат NULL стойности.

Така че, ако предадем и двете колони на COALESCE() , получаваме резултат от NULL :

SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Резултат:

NULL

Същото е вярно, ако заменим една от колоните с NULL константа:

SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Резултат:

NULL

Така че това е само когато всички аргументите са NULL константа, че получаваме грешка.

Заменете NULL Резултати с известна стойност

Можем да включим известна стойност като последен аргумент, за да заменим всички резултати NULL с тази известна стойност.

Например следната заявка връща NULL :

SELECT SUM( UnitPrice ) 
FROM Sales.SpecialDeals;

Резултат:

NULL

В този случай UnitPrice колоната съдържа NULL стойности във всички редове, така че резултатът е NULL .

Можем да използваме COALESCE() така:

SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;

Резултат:

0.00

Сега резултатът NULL се заменя с известна стойност (нула).

COALESCE() срещу CASE

COALESCE() изразът всъщност е синтактичен пряк път за CASE изразяване. Когато използваме COALESCE() израз, оптимизаторът на заявки го пренаписва като CASE израз.

Когато изпълня следното изявление:

SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Оптимизаторът на заявки го пренаписва на следното:

CASE 
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] 
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID] 
END

COALESCE() срещу ISNULL()

В някои отношения COALESCE() изразът е подобен на ISNULL() функция. Но има разлики. По-специално:

  • ISNULL() е функция и се оценява само веднъж. COALESCE() от друга страна, е израз и потенциално може да бъде оценен многократно.
  • Определянето на типа данни на резултантния израз е различно. ISNULL използва типа данни на първия параметър, COALESCE следва CASE правила за израз и връща типа данни на стойност с най-висок приоритет.
  • Възможността NULL на резултатния израз е различна за ISNULL и COALESCE . ISNULL връщаната стойност винаги се счита, че НЕ НУЛЕВА (ако приемем, че връщаната стойност не може да бъде нула). За разлика от това, COALESCE с ненулеви параметри се счита за NULL .
  • Проверки за ISNULL и COALESCE също са различни. Например NULL стойност за ISNULL се преобразува в int макар и за COALESCE , трябва да предоставите тип данни.
  • ISNULL приема само два параметъра. За разлика от това COALESCE приема променлив брой параметри.

Повече информация

Вижте документацията на Microsoft за повече подробности и по-сложни примери.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Подреждане на опашка в OneWay WCF съобщения с помощта на Windows Service и SQL Server

  2. Извличане на изображение от база данни в asp.net

  3. Какво е @@MAX_PRECISION в SQL Server?

  4. Най-бързият начин за актуализиране на 120 милиона записа

  5. Поддръжка на системни бази данни на SQL Server