我们再来看看一个二者的不同
DECLARE @c CHAR(10);
SELECT 'x' + COALESCE(@c, '') + 'y';
SELECT 'x' + ISNULL(@c, '') + 'y';
我们到这里其实我们可以稍微概括下二者的区别:ISNULL着重于替换,而COALESCE着重于合并。COALESCE显示忽略了NULL并用空字符串填充并压缩,而ISNULL对NULL会用空字符串填充但不会压缩。
(4)COALESCE函数支持超过两个参数
对于多个参数输入,ISNULL函数需要嵌套调用,而COALESCE能够处理任何数量,至于上限不知,所以对于多个参数使用COALESCE更加,如下使用多个参数输入。
SELECT COALESCE(a, b, c, d, e, f, g) FROM dbo.table;而对于ISNULL,我们需要这样做
SELECT ISNULL(a, ISNULL(b, ISNULL(c, ISNULL(d, ISNULL(e, ISNULL(f, g)))))) FROM dbo.table;二者最终执行时和利用CASE一样
CASE WHEN [tempdb].[dbo].[table].[a] IS NOT NULL THEN [tempdb].[dbo].[table].[a] ELSE CASE WHEN [tempdb].[dbo].[table].[b] IS NOT NULL THEN [tempdb].[dbo].[table].[b] ELSE CASE WHEN [tempdb].[dbo].[table].[c] IS NOT NULL THEN [tempdb].[dbo].[table].[c] ELSE CASE WHEN [tempdb].[dbo].[table].[d] IS NOT NULL THEN [tempdb].[dbo].[table].[d] ELSE CASE WHEN [tempdb].[dbo].[table].[e] IS NOT NULL THEN [tempdb].[dbo].[table].[e] ELSE CASE WHEN [tempdb].[dbo].[table].[f] IS NOT NULL THEN [tempdb].[dbo].[table].[f] ELSE [tempdb].[dbo].[table].[g] END END END END END END(5)COALESCE和ISNULL二者性能比较
我们来运行如下查询
DBCC DROPCLEANBUFFERS;
DECLARE
@a VARCHAR(5), -- = 'str_a', -- this line changed per test
@b VARCHAR(5), -- = 'str_b', -- this line changed per test
@v VARCHAR(5),
@x INT = 0,
@time DATETIME2(7) = SYSDATETIME();
WHILE @x <= 500000
BEGIN
SET @v = COALESCE(@a, @b); --COALESCE
SET @x += 1;
END
SELECT DATEDIFF(MILLISECOND, @time, SYSDATETIME());
GO
DBCC DROPCLEANBUFFERS;
DECLARE
@a VARCHAR(5), -- = 'str_a', -- this line changed per test
@b VARCHAR(5), -- = 'str_b', -- this line changed per test
@v VARCHAR(5),
@x INT = 0,
@time DATETIME2(7) = SYSDATETIME();
WHILE @x <= 500000
BEGIN
SET @v = ISNULL(@a, @b); --ISNULL
SET @x += 1;
END
SELECT DATEDIFF(MILLISECOND, @time, SYSDATETIME());我们有查询四个场景:(1)两个参数都为NULL(2)第一个参数为NULL(3)第二个参数为NULL(4)两个参数都为NULL。每个场景测试十次,最终得出如下结果










