当有多个列 [and]/[or] 值并且您想要第一个值时,coalesce() 是最佳解决方案。但是,在线查看书籍时,查询优化会将其转换为案例语句。
MSDN 摘录
COALESCE 表达式是 CASE 表达式的语法快捷方式。
也就是说,查询优化器将代码 COALESCE(expression1,...n) 重写为以下 CASE 表达式:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
...
ELSE expressionN
END
话虽如此,为什么不简单的 ISNULL() 呢?更少的代码 = 更好的解决方案?
这是一个完整的代码片段。
-- drop the test table
drop table #temp1
go
-- create test table
create table #temp1
(
issue varchar(100) NOT NULL,
total_amount int NULL
);
go
-- create test data
insert into #temp1 values
('No nulls here', 12),
('I am a null', NULL);
go
-- isnull works fine
select
isnull(total_amount, 0) as total_amount
from #temp1
最后但同样重要的是,如何将空值放入 NOT NULL 列?
我必须更改表定义才能设置测试用例。当我尝试将表更改为 NOT NULL 时,它会失败,因为它会进行可空性检查。
-- this alter fails
alter table #temp1 alter column total_amount int NOT NULL