二白又更新啦~~~~
首先,感谢冯女士和孙先生对本文的大力支持,感谢你们为大数据踩坑专业户做出的卓越贡献,感恩

收~~~~
首先,我们看一下数据集
table | t_user_full_1d | |
| user_id | user_t | dt |
| 123 | a | 2021-08-31 |
| 124 | b | 2021-08-31 |
| 125 | null | 2021-08-31 |
| 126 | c | 2021-08-31 |
| 127 | null | 2021-08-31 |
| 128 | f | 2021-08-31 |
接下来我们统计user_t 不等于a,b的用户数,统计计算出总用户数,和user_t 等于a,b的数据
selectcount(1) as total_num,count(case when user_t in (a,b) then user_id end) as ab_num,count(case when user_t not in (a,b) then user_id end) as n_ab_num,count(case when nvl(user_t,0) not in (a,b) then user_id end) as n_ab_num2,count(case when user_t is null then user_id end) as null_numfrom t_user_full_1dwhere dt='2021-08-31'
执行sql之后我们的得到的结果是:
| total_num | ab_num | n_ab_num | n_ab_num2 | null_num |
| 6 | 2 | 2 | 4 | 2 |
从执行结果我们可以看出,同样是计算 user_t not in (a,b),但是得到的结果是不一样的。总结数据后我们可以得出 total_num = ab_num+n_ab_num+null_num。
这个结论和我们日常理解的 in+not in= all 是有出入的。出现这种情况的原因是 null 值导致的。因为在进行in,和not in 的判断中返回的是Boolean类型,但Boolean(null)返回的还是null,所以以上in,not in在执行过程中返回的结果是这样的
| user_id | user_t | user_t in (a,b) | user_t not in (a,b) |
| 123 | a | True | False |
| 124 | b | True | False |
| 125 | null | Null | Null |
| 126 | c | False | True |
| 127 | null | Null | Null |
| 128 | f | False | True |
按照我们的逻辑只统计值为True的数据,所以在 not in的情况下,为null的这部分数据不会被统计到。
上述问题,在where 条件中会出现同样的情况,大家可以自行验证,所以在使用not in的过程我们不能确认是否有空值是可以做空值处理,保证数据统计的准确性。
更新结束~~~
文章转载自李二白,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




