http://msdn.microsoft.com/en-us/library/ms190349.aspx
COALESCE相当与下面的CASE语句:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
...
ELSE expressionN
END
废话少说,还是举例说明。假设有一个Table,
现有数据如下:
输入SQL语句如下:
SELECT TOP 1000 [EmployeeID]
,[Hourly_Wage]
,[Salary]
,[Commission]
,[Num_Sales]
FROM [Wages]
SELECT [EmployeeID]
,COALESCE([Hourly_Wage],0) as 'Hourly_Wage'
,COALESCE([Salary],0) as 'Salary'
,COALESCE([Commission],0) as Commission
,COALESCE([Num_Sales],0) as Num_Sales
FROM [Wages]
我们可以看到结果如下:
可以看到这两个结果的差别就是NULL的地方都变成了0
这是最简单的COALESCE的用法。
下面我们开始复杂一点。
输入SQL语句如下:
SELECT *,COALESCE(hourly_wage, salary,commission * num_sales) as total
FROM dbo.wages
这段SQL语句的意思就是,
如果Hourly_Wage字段不为NULL,则Total字段=Hourly_Wage字段内容。
不再考虑salary,commission等字段内容了。
如果Hourly_Wage字段为NULL,则考察Salary字段,
看到这里,大家要问了,那如果Commission或者Num_Sales的值也为NULL呢?或者所有字段的值都为NULL呢?那Total会是NULL还是0?
结果如下:
这时候,好动脑筋的同学们又要问了,我不想要NULL啊,可不可以NULL变成0呢?当然可以,这样写就行。
SELECT *,COALESCE(COALESCE(hourly_wage, salary, commission * num_sales),0) as total
FROM dbo.wages
或者用ISNULL函数,
SELECT *,isnull(COALESCE(hourly_wage, salary, commission * num_sales),0) as total
FROM dbo.wages
结果都一样,如下: