背景
在某个项目统计数据时,发现以外丢掉了部分数据,仔细查找,是null值在in/not in出现了判断问题。
问题
在统计数据时,需要去除某些值,使用了not in逻辑。
select null not in ('1', '2')
这行代码,要完成的逻辑是,null 不属于 '1' 或者 '2'。
想当然认为应该返回 true,实际上返回了null,null值映射为false。
最终统计丢失了这一部分null值。
继续测试
继续测试了各种null使用in/not in的例子
select null in ('1', '2', null);
select '3' not in ('1', '2', null);
select null not in ('1', '2');
都出现了与想当然不符合的结果
该问题的详细原理可以参考这篇文章 http://www.itpub.net/thread-1325582-1-1.html
小结
null值不应该参与in/not in逻辑判断。