为了账号安全,请及时绑定邮箱和手机立即绑定

使用ISNULL与使用COALESCE检查特定条件?

使用ISNULL与使用COALESCE检查特定条件?

斯蒂芬大帝 2019-12-04 10:17:54
我知道可以将多个参数传递给COALESCE,但是当您只想检查一个表达式以查看它是否不存在时,您使用默认值还是使用更好的做法ISNULL?两者之间是否有任何性能提升?
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

Microsoft Connect上报告的此问题揭示了COALESCE和之间的一些区别ISNULL:


我们处理的早期部分重写COALESCE( expression1, expression2 )为CASE WHEN expression1 IS NOT NULL THEN expression1 ELSE expression2 END。在[此示例]中:


COALESCE ( ( SELECT Nullable

             FROM Demo

             WHERE SomeCol = 1 ), 1 )

我们生成:


SELECT CASE

          WHEN (SELECT Nullable FROM Demo WHERE SomeCol = 1) IS NOT NULL

          THEN (SELECT Nullable FROM Demo WHERE SomeCol = 1)

          ELSE 1

       END

查询处理的后期阶段不了解这两个子查询原本是相同的表达式,因此它们执行了两次子查询...


尽管我不愿提出建议,但一种解决方法是将更COALESCE改为ISNULL,因为后者不会复制子查询。


查看完整回答
反对 回复 2019-12-04
?
弑天下

TA贡献1818条经验 获得超7个赞

我认为不是,但是COALESCE是SQL '92标准的,并得到更多不同数据库的支持。如果您追求可移植性,请不要使用ISNULL。


查看完整回答
反对 回复 2019-12-04
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

值得一提的是,两者之间的类型处理也可以有所作为(请参阅此相关答案项(2))。


假设查询尝试使用快捷方式编写空比较:


select * from SomeTable

 where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);

不同于


select * from SomeTable

 where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);

因为在第一种情况下,IsNull()强制类型为一点(因此将-1转换为true),而在第二种情况下,两者都会提升为int值。


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)。


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 664 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信