NULL真的是一个很棘手的问题。困扰我很长的时间了,现在总算解决了这个问题,得出最深刻的一个感受就是,要对每一个可能为NULL的地方进行特殊处理。
就按照我遇到的问题来说吧。我在写一个游标的时候,游标完成这样的功能:从一张表(假设A)中选择数据,然后再从另一张表(假设B)中选择数据进行对比更新,和相应的计算,然后插入到A表中。这是个很简单的过程,对于整齐的数据可以很顺利的进行下去,可是当异常发生了。。。A表中有的数值为NULL需要选择出来,B表中有的数值为NULL需要更新插入,A,B表中的数值需要进行比较。。。blablabla。。游标在某一条含有NULL值的记录处,罢工了。
我试过各种方法调试,出现的问题也很奇葩,找各路神仙一时半会也搞不懂,于是我觉得对程序进行大改,从根源解决NULL问题,就像我前面说的一样,对于每一个可能为NULL的值都进行特殊处理!对于NULL,有一条原则需要记住,NULL跟任何值的比较结果都不会为真。
对于select中对于可能出现NULL的地方,可以这样处理,MYSQL自带一个IFNULL(EXP1,EXP2)的函数,判断若EXP1为NULL,则将EXP2的值赋给EXP1,这样就将选择出来的数据断绝了为NULL的可能。很简单的做法,用一个带有标识性的值来替代NULL,通常可以选择'',空格,既能形象的显示该属性的实际无值的概念,又能对以后的比较啊赋值啊提供方便。
对于判断某值是否为NULL的做法:IF (_fixed_version_id IS NULL)THEN。。。一定要这样判断,才可能比较出结果,用神马=,<,>,神马的都是false的。
游标中断的原因是因为某个where语句中的条件 WHERE a.fixed_version_id = _fixed_version_id AND a.id = b.id,_fixed_version_id 可能为NULL,于是这条语句是不能进行下去的。所以一定要用if条件在前面特殊处理一下。