TI ISNULL()是一个懒惰的函数?
也就是说,如果我编写如下代码:
SELECT ISNULL(MYFIELD,getMyFunction())来自MYTABLE
它会一直评估getMyFunction()还是仅在MYFIELD实际为空的情况下评估它?
解决方法
这是它认为最好的效果.
现在它在功能上很懒,这是重要的.例如.如果col1是一个varchar,当col2为null时,它总是包含一个数字,那么
isnull(col2,cast(col1 as int))
将工作.
但是,没有指定它是否会在null检查之前或同时尝试强制转换,如果col2不为null,则会吃掉错误,或者如果col2为null,它将只尝试强制转换.
至少,我们希望它在任何情况下都能获得col1,因为获得2个值的表的单次扫描将比两次扫描获得一个更快.
可以以非常不同的方式执行相同的sql命令,因为我们给出的指令基于索引的知识和关于表的统计信息而变成较低级别的操作.
出于这个原因,就性能而言,答案是“当它看起来好像是一个好主意,否则就不是”.
就观察到的行为而言,它是懒惰的.
编辑:Mikael Eriksson的回答显示,由于不是懒惰,有些情况可能确实是错误的.在性能影响方面,我会坚持我的答案,但至少在某些情况下,他对正确性影响至关重要.