MySQL中NOT IN填坑之列为null的问题解决
前一段时间在公司做一个小功能的时候,统计一下某种情况下有多少条数据,然后修改的问题,当时感觉很简单,写了一个如下的SQL:
SELECTCOUNT(*)FROMt1wheretl.c1notIN(SELECTt2.c1FROMt2);
预期的结果是:有多少条数据在t1中,同时不在t2中,结果为:0,也就是t1中数据都在t2中,但是很容易就发现某些数据在t1中不在t2中,所以就感觉很奇怪,这个SQL看着也没问题啊。经过一番查询原来是因为t2的c1字段包含了null值,修改如下两种形式都可以得到预期的结果:
SELECTCOUNT(*)FROMt1LEFTJOINt2ONt1.c1=t2.c1WHEREt2.c1ISNULLORt2.c1='';
或者
selectCOUNT(*)fromt1wheret1.c1notin( selectt2.c1fromt2wheret2.c1isnotnullANDt2.c1!='' );
所以都是null引起的(为了避免错误我把空串也加上了),原因是notin的实现原理是,对每一个t1.c1和每一个t2.c1(括号内的查询结果)进行不相等比较(!=)。
foreachc1int2: ift1.c1!=c1: continue else: returnfalse returntrue
而SQL中任意!=null的运算结果都是false,所以如果t2中存在一个null,notin的查询永远都会返回false,即查询结果为空。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。