sql >> Databáze >  >> RDS >> Sqlserver

SQL Server COALESCE() Vysvětleno

V SQL Server, COALESCE() expression vrátí svůj první nenulový argument.

Funguje to tak, že výrazu předáme seznam argumentů, vyhodnotí argumenty v pořadí a vrátí aktuální hodnotu prvního výrazu, který se zpočátku nevyhodnocuje na NULL .

Syntaxe

Syntaxe vypadá takto:

COALESCE ( expression [ ,...n ] )

Příklad

Zde je jednoduchý příklad k demonstraci:

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

Výsledek:

Cat

V tomto případě Cat byl první argument bez NULL, a tak COALESCE() vrátil tuto hodnotu.

Výrazy

Jak již bylo zmíněno, COALESCE() vrátí aktuální hodnotu prvního výrazu, který se zpočátku nevyhodnotí jako NULL . Pokud tedy předáme výraz jako tento:

SELECT COALESCE( null, 2 * 3 );

Dostáváme toto:

6

Funkce vrací datový typ výrazu s nejvyšší prioritou datového typu. Pokud jsou všechny výrazy nenulovatelné, bude výsledek zapsán jako nenulovatelný.

Když jsou všechny argumenty NULL

Pokud jsou všechny argumenty NULL , COALESCE() vrátí NULL . Alespoň jedna z hodnot null však musí být zadaná NULL , jinak dojde k chybě.

Jinými slovy, všechny nemohou být NULL konstantní:

SELECT COALESCE( null, null );

Dostáváme toto:

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.

V tomto případě byly všechny argumenty NULL konstantní, a tak byla vrácena chyba.

Níže je uveden příklad databáze demonstrující scénář, kde COALESCE() vrátí NULL když jsou všechny argumenty NULL .

Předpokládejme, že spustíme následující dotaz:

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

Výsledek:

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

Oba sloupce obsahují NULL hodnoty.

Pokud tedy předáme oba sloupce COALESCE() , dostaneme výsledek NULL :

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

Výsledek:

NULL

Totéž platí, pokud nahradíme jeden ze sloupců hodnotou NULL konstantní:

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

Výsledek:

NULL

Takže jen když vše argumenty jsou NULL konstantní, že dostaneme chybu.

Nahradit NULL Výsledky se známou hodnotou

Můžeme zahrnout známou hodnotu jako poslední argument, který nahradí všechny výsledky NULL touto známou hodnotou.

Například následující dotaz vrátí NULL :

SELECT SUM( UnitPrice ) 
FROM Sales.SpecialDeals;

Výsledek:

NULL

V tomto případě UnitPrice obsahuje ve všech řádcích hodnoty NULL, takže výsledek byl NULL .

Můžeme použít COALESCE() takhle:

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

Výsledek:

0.00

Nyní je výsledek NULL nahrazen známou hodnotou (nula).

COALESCE() vs CASE

COALESCE() výraz je ve skutečnosti syntaktická zkratka pro CASE výraz. Když použijeme COALESCE() výraz, optimalizátor dotazů jej přepíše jako CASE výraz.

Když spustím následující příkaz:

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

Optimalizátor dotazů jej přepíše na následující:

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

COALESCE() vs ISNULL()

V některých ohledech COALESCE() výraz je podobný ISNULL() funkce. Ale existují rozdíly. Konkrétně:

  • ISNULL() je funkce a vyhodnocuje se pouze jednou. COALESCE() na druhé straně je výraz a může být potenciálně vyhodnocen vícekrát.
  • Určení datového typu výsledného výrazu je odlišné. ISNULL používá datový typ prvního parametru, COALESCE následuje za CASE výraz pravidla a vrátí datový typ hodnoty s nejvyšší prioritou.
  • Schopnost hodnoty NULL výsledného výrazu se u výrazu ISNULL liší a COALESCE . ISNULL návratová hodnota je vždy považována za hodnotu NOT NULLable (za předpokladu, že návratová hodnota je bez možnosti null). Naproti tomu COALESCE s nenulovými parametry se považuje za NULL .
  • Ověření pro ISNULL a COALESCE jsou také různé. Například NULL hodnotu pro ISNULL se převede na int i když pro COALESCE , musíte zadat typ dat.
  • ISNULL má pouze dva parametry. Naproti tomu COALESCE přebírá proměnný počet parametrů.

Další informace

Další podrobnosti a složitější příklady naleznete v dokumentaci společnosti Microsoft.


  1. Jak připojit vzdálenou databázi MySQL v PHP

  2. PŘIDAT SLOUPEK MySQL

  3. Jak vrátit seznam spouštěcích událostí na serveru SQL Server

  4. Výukový program ovládání Activex ListView-01