我知道可以向COALESCE
传递多个参数,但是当您只想检查一个表达式是否不存在时,您是使用默认值还是使用ISNULL
更好呢?
两者之间是否有性能上的提升?
发布于 2011-09-14 05:42:42
我不这么认为,但是COALESCE是在SQL '92标准中的,并且被更多不同的数据库支持。如果你想要可移植性,就不要使用ISNULL。
发布于 2014-03-14 00:21:18
发布于 2014-10-07 04:45:18
值得一提的是,两者之间的类型处理也会有所不同(参见this related answer item (2))。
假设查询尝试使用快捷方式来编写空比较:
select * from SomeTable
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
这不同于
select * from SomeTable
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
因为在第一种情况下,IsNull()强制类型为位(因此-1被转换为true),而第二种情况将两者都提升为整型。
with input as
(
select convert(bit, 1) as BitOn,
convert(bit, 0) as BitOff,
convert(bit, null) as BitNull
)
select BitOn,
BitOff,
BitNull,
IsNull(BitOn, -1) IsNullBitOn, -- true
IsNull(BitOff, -1) IsNullBitOff, -- false
IsNull(BitNull, -1) IsNullBitNull, -- true, converts the -1 to bit
coalesce(BitOn, -1) CoalesceBitOn, -- 1
coalesce(BitOff, -1) CoalesceBitOff, -- 0
coalesce(BitNull, -1) CoalesceBitNull -- -1
from input;
这个问题本身也有类似的评论/链接(@Martin Smith)。
https://stackoverflow.com/questions/7408893
复制相似问题