P:前辈,请教个问题:null值在进行SUM,AVG等操作时默认是忽略的,对吗,那对AVG的结果应该会有影响吧,所以操作之前是不是要ISNULL转换,谢谢
facetok:不需要
P:为什么,会有影响吧
facetok:设计时最好有默认值,如果是关键字的话
facetok:用默认值设计去优化,数字型;实在需要判断时,别在数据库判断,用程序逻辑是判断。
P:现在是设计时没有默认值,数据类型也有点问题,所以我做了类似这样的转换:
AVG(ISNULL(CAST(Detail3 as int),0)),sql转换效率比不上程序逻辑判断吗
facetok:你这种处理只能解决实际问题,但很不好。如果这种表很多呢?应考虑从根本上解决表设计的缺陷
P:那前辈的建议是我现在改掉数据类型,然后加上默认值是吗
facetok:如果没有默认值,可修改表设计。也可批量操作,对null改变值为0。对
P:好,了解了,谢谢
facetok:因为你这种处理不是源头解决方案:AVG(ISNULL(。。。别人做到模块可能没做判断,从而形成的系统的风险
P:恩,受教了,写程序时多考虑一些极限情况,比如NULL等等,是吗
facetok:必须的,如果程序不够健壮,很容易报错的。很简单的异常测试就能发现bug
P:因为很多时候考虑到非特殊情况下,不会出现这些边缘测试和极限测试才出现的数据,
(比如有个同事说,这个查询出来的肯定有数据,这个List进不进行非空判断没多大影响) 所以有时写程序有点放松
facetok:嗯,这是经验问题,需要慢慢积累。严谨的结构必须包含验证/判断和异常处理,并且这些要尽量归纳为通用的处理机制
P:通用的处理机制指的是什么,可以举个例子吗
facetok:就是一些封装,基类和工具类等