COALESCE (Transact-SQL)
Возвращает первое выражение из списка аргументов, не равное NULL.
Синтаксические обозначения в Transact-SQL
Синтаксис
COALESCE ( expression [ ,...n ] )
Аргументы
- expression
Выражение cce77650-ce6b-4feb-9094-42409dfbeaab любого типа данных.
Типы возвращаемых данных
Возвращает тип данных аргумента в выражении expression с наиболее высоким приоритетом.
Замечания
Если все аргументы равны NULL, функция COALESCE возвращает NULL.
Примечание. |
---|
По меньшей мере одно из значений NULL должно быть типизированным NULL. |
Функция COALESCE(expression1**,**...n) является эквивалентом следующей функции CASE:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
...
WHEN (expressionN IS NOT NULL) THEN expressionN
ELSE NULL
END
Поведение функций ISNULL и COALESCE может быть различным, несмотря на их равнозначность. Выражение, содержащее ISNULL с параметрами, отличными от NULL, считается NOT NULL, в то время как выражения, содержащие COALESCE с параметрами, отличными от NULL, рассматриваются как NULL. В SQL Server, для индексации выражений, содержащих COALESCE с параметрами, отличными от NULL, вычисляемый столбец можно сохранить с помощью атрибута столбца PERSISTED, как в следующей инструкции:
CREATE TABLE #CheckSumTest
(
ID int identity ,
Num int DEFAULT ( RAND() * 100 ) ,
RowCheckSum AS COALESCE( CHECKSUM( id , num ) , 0 ) PERSISTED PRIMARY KEY
)
Примеры
В следующем примере таблица wages
включает три столбца с данными о ежегодной заработной плате служащих: ежечасная оплата, жалование и комиссионные. Однако служащие получают только один тип зарплаты. Для определения общей оплаты для всех служащих используйте функцию COALESCE
для получения не равных NULL значений столбцов hourly_wage
, salary
и commission
.
SET NOCOUNT ON;
GO
USE master;
IF EXISTS (SELECT name FROM sys.tables
WHERE name = 'wages')
DROP TABLE wages;
GO
CREATE TABLE wages
(
emp_id tinyint identity,
hourly_wage decimal NULL,
salary decimal NULL,
commission decimal NULL,
num_sales tinyint NULL
);
GO
INSERT wages VALUES(10.00, NULL, NULL, NULL);
INSERT wages VALUES(20.00, NULL, NULL, NULL);
INSERT wages VALUES(30.00, NULL, NULL, NULL);
INSERT wages VALUES(40.00, NULL, NULL, NULL);
INSERT wages VALUES(NULL, 10000.00, NULL, NULL);
INSERT wages VALUES(NULL, 20000.00, NULL, NULL);
INSERT wages VALUES(NULL, 30000.00, NULL, NULL);
INSERT wages VALUES(NULL, 40000.00, NULL, NULL);
INSERT wages VALUES(NULL, NULL, 15000, 3);
INSERT wages VALUES(NULL, NULL, 25000, 2);
INSERT wages VALUES(NULL, NULL, 20000, 6);
INSERT wages VALUES(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 wages;
GO
Ниже приводится результирующий набор.
Total Salary
------------
20800.0000
41600.0000
62400.0000
83200.0000
10000.0000
20000.0000
30000.0000
40000.0000
45000.0000
50000.0000
120000.0000
56000.0000
(12 row(s) affected)
См. также
Справочник
CASE (Transact-SQL)
ISNULL (Transact-SQL)
Системные функции (Transact-SQL)