COALESCE (Transact-SQL)

返回其参数中第一个非空表达式。

主题链接图标Transact-SQL 语法约定

语法

 COALESCE ( expression [ ,...n ] ) 

参数

返回类型

返回数据类型优先级最高的 expression 的数据类型。

备注

如果所有参数均为 NULL,则 COALESCE 返回 NULL。

ms190349.note(zh-cn,SQL.90).gif注意:
至少应有一个空值为 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 的表达式将视为 NOT NULL,而包含具有非空参数的 COALESCE 的表达式将视为 NULL。在 SQL Server 中,若要对包含具有非空参数的 COALESCE 的表达式创建索引,可以使用 PERSISTED 列属性将计算列持久化,如以下语句所示:

CREATE TABLE #CheckSumTest 
(
        ID int identity ,
        Num int DEFAULT ( RAND() * 100 ) ,
        RowCheckSum AS COALESCE( CHECKSUM( id , num ) , 0 ) PERSISTED PRIMARY KEY
)

示例

在以下示例中,wages 表中包括以下三列有关雇员的年薪的信息:hourly wage、salary 和 commission。但是,每个雇员只能接受一种付款方式。若要确定支付给所有雇员的金额总数,请使用 COALESCE 函数,它只接受在 hourly_wagesalarycommission 中找到的非空值。

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)

帮助和信息

获取 SQL Server 2005 帮助