Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
Elemzési platformrendszer (PDW)
SQL Analytics-végpont a Microsoft Fabricben
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
Az argumentumokat sorrendben értékeli ki, és az első olyan kifejezés aktuális értékét adja vissza, amely kezdetben nem NULL. Az alábbi példa a harmadik értéket adja vissza, mert a harmadik érték az első érték, amely nem null.
SELECT COALESCE(NULL, NULL, 'third_value', 'fourth_value');
Note
Ha sztringeket szeretne összefűzni, használja inkább a STRING_AGG.
Transact-SQL szintaxis konvenciói
Syntax
COALESCE ( expression [ , ...n ] )
Arguments
expression
Bármilyen típusú kifejezés.
Visszatérési típusok
A legmagasabb adattípus-prioritású kifejezés adattípusát adja vissza,. Ha az összes kifejezés nem null értékű, a rendszer nem null értékűként írja be az eredményt.
Remarks
Ha az összes argumentum NULL, COALESCENULLad vissza. A null értékek legalább egyikének beírt NULLkell lennie.
A COALESCE és a CASE összehasonlítása
A COALESCE kifejezés a CASE kifejezés szintaktikai parancsikonja. A lekérdezésoptimalizáló a következő COALESCE(<expression1>, ...n) kifejezésként írja át a CASE kódot:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
...
ELSE expressionN
END
Így a bemeneti értékek (kifejezés1, kifejezés2, expressionNstb.) többszörös kiértékelése történik. Az alqueryt tartalmazó értékkifejezések nemdeterminisztikusnak minősülnek, és a rendszer kétszer értékeli ki az al lekérdezést. Ez az eredmény megfelel az SQL-szabványnak. Mindkét esetben különböző eredményeket lehet visszaadni az első értékelés és a közelgő értékelések között.
A COALESCE((subquery), 1) kód végrehajtásakor például a rendszer kétszer kiértékeli az al lekérdezést. Ennek eredményeképpen a lekérdezés elkülönítési szintjétől függően különböző eredményeket kaphat. A kód például többfelhasználós környezetben NULL elkülönítési szinten READ COMMITTED adhat vissza. A stabil eredmények visszaadásához használja az SNAPSHOT ISOLATION elkülönítési szintet, vagy cserélje le a COALESCE a ISNULL függvényre. Másik lehetőségként újraírhatja a lekérdezést, hogy az al lekérdezést egy aljelölőbe küldje, ahogyan az alábbi példában látható:
SELECT CASE WHEN x IS NOT NULL THEN x ELSE 1 END
FROM (SELECT (SELECT Nullable
FROM Demo
WHERE SomeCol = 1) AS x) AS T;
A COALESCE és az ISNULL összehasonlítása
A ISNULL függvény és a COALESCE kifejezés hasonló célt szolgál, de eltérően viselkedhet.
Mivel
ISNULLfüggvény, csak egyszer lesz kiértékelve. A korábban ismertetett módon aCOALESCEkifejezés bemeneti értékei többször is kiértékelhetők.Az eredményként kapott kifejezés adattípus-meghatározása eltérő.
ISNULLaz első paraméter adattípusát használja, ésCOALESCEaCASEkifejezési szabályokat követi, hogy a legmagasabb prioritású adattípust adja vissza.Az eredménykifejezés NULLability értéke
ISNULLésCOALESCEesetében eltérő. AISNULLvisszatérési érték mindig nem null értékű (feltéve, hogy a visszatérési érték nem null értékű). Ezzel szemben a nem null paraméterekkel rendelkezőCOALESCENULL. AISNULL(NULL, 1)ésCOALESCE(NULL, 1)kifejezések tehát – bár egyenlőek – különböző nullképességi értékekkel rendelkeznek. Ezek az értékek akkor tesznek különbséget, ha ezeket a kifejezéseket számítási oszlopokban használja, kulcskényszereket hoz létre, vagy egy skaláris, felhasználó által definiált függvény (UDF) visszatérési értékét determinisztikussá teszi, hogy indexelhető legyen az alábbi példában látható módon:USE tempdb; GO -- This statement fails because the PRIMARY KEY cannot accept NULL values -- and the nullability of the COALESCE expression for col2 -- evaluates to NULL. CREATE TABLE #Demo ( col1 INT NULL, col2 AS COALESCE (col1, 0) PRIMARY KEY, col3 AS ISNULL(col1, 0) ); -- This statement succeeds because the nullability of the -- ISNULL function evaluates AS NOT NULL. CREATE TABLE #Demo ( col1 INT NULL, col2 AS COALESCE (col1, 0), col3 AS ISNULL(col1, 0) PRIMARY KEY );A
ISNULLés aCOALESCEellenőrzése is eltérő. ANULLISNULLértéke például int lesz, deCOALESCEesetében meg kell adnia egy adattípust.ISNULLcsak két paramétert vesz fel. Ezzel szembenCOALESCEváltozó számú paramétert vesz igénybe.
Examples
A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.
A. Adatok visszaadása az első oszlopból, amely nem null értékű
Az alábbi példa bemutatja, hogy COALESCE hogyan választja ki az adatokat a nem null értékű első oszlopból. Tegyük fel ebben a példában, hogy a Products tábla tartalmazza ezeket az adatokat:
Name Color ProductNumber
------------ ---------- -------------
Socks, Mens NULL PN1278
Socks, Mens Blue PN1965
NULL White PN9876
Ezután a következő COALESCE lekérdezést futtatjuk:
SELECT Name,
Color,
ProductNumber,
COALESCE (Color, ProductNumber) AS FirstNotNull
FROM Products;
Itt van az eredményhalmaz.
Name Color ProductNumber FirstNotNull
------------ ---------- ------------- ------------
Socks, Mens NULL PN1278 PN1278
Socks, Mens Blue PN1965 Blue
NULL White PN9876 White
Az első sorban a FirstNotNull érték PN1278, nem Socks, Mens. Ez az érték azért van így, mert a Name oszlop nem lett megadva paraméterként a példában szereplő COALESCE számára.
B. A nem null értéket adja vissza egy bértáblában
A következő példában a wages táblázat három oszlopot tartalmaz, amelyek az alkalmazottak éves bérével kapcsolatos információkat tartalmazzák: az órabér, a fizetés és a jutalék. Az alkalmazott azonban csak egy típusú fizetést kap. Az összes alkalmazottnak kifizetett teljes összeg meghatározásához használja a COALESCE, hogy csak a hourly_wage, salaryés commissiontalálható nem null értéket kapja .
SET NOCOUNT ON;
GO
USE tempdb;
IF OBJECT_ID('dbo.wages') IS NOT NULL
DROP TABLE wages;
GO
CREATE TABLE dbo.wages
(
emp_id TINYINT IDENTITY,
hourly_wage DECIMAL NULL,
salary DECIMAL NULL,
commission DECIMAL NULL,
num_sales TINYINT NULL
);
GO
INSERT dbo.wages (hourly_wage, salary, commission, num_sales)
VALUES (10.00, NULL, NULL, NULL),
(20.00, NULL, NULL, NULL),
(30.00, NULL, NULL, NULL),
(40.00, NULL, NULL, NULL),
(NULL, 10000.00, NULL, NULL),
(NULL, 20000.00, NULL, NULL),
(NULL, 30000.00, NULL, NULL),
(NULL, 40000.00, NULL, NULL),
(NULL, NULL, 15000, 3),
(NULL, NULL, 25000, 2),
(NULL, NULL, 20000, 6),
(NULL, NULL, 14000, 4);
GO
SET NOCOUNT OFF;
GO
SELECT CAST (COALESCE (hourly_wage * 40 * 52, salary, commission * num_sales) AS MONEY) AS 'Total Salary'
FROM dbo.wages
ORDER BY 'Total Salary';
GO
Itt van az eredményhalmaz.
Total Salary
------------
10000.00
20000.00
20800.00
30000.00
40000.00
41600.00
45000.00
50000.00
56000.00
62400.00
83200.00
120000.00