1 摘要
当我们在做数据库查询优化时,可能会用到范围查询如 BETWEEN
, IN
等语句,这里记录一次在项目中使用 IN
查询 IN
后边包含 NULL
值时导致查询结果错误的问题
2 场景复现
有一个用户表,里边总共有 11
条数据
-- IN 测试
SELECT COUNT(*) FROM `user`;
查询结果
使用 IN
进行范围查询,IN
后边包含 NULL
SELECT id FROM `user` WHERE id IN (1,2,3,NULL);
预想结果 :1,2,3
实际结果:
使用 NOT IN
进行反向查询
SELECT id FROM `user` WHERE id NOT IN (1,2,3,NULL);
预想结果: 4,5,6,7,8,9,10,11
实际结果:
3 结论
在 MySQL 数据中,当使用 NOT IN
进行条件范围查询时, IN
后边如果有 NULL
值,则可能导致查询结果错误
出现场景: 在多表联合查询时,可能 IN
后边接的是一个子查询,这时子查询结果就可能出现 NULL
值,就会导致上边的错误
4 解决办法
为了避免查询结果不准确,在使用 IN
/ NOT IN
进行范围查询时,IN
后边的值必须不为空,可以使用 IFNULL(expr1,expr2)
来对 NULL
值进行设定默认值
IFNULL(expr1,expr2)
方法使用说明: 如果表达式1(expr1
) 为 NULL
, 则整个表达式结果为表达式2(expr2
)
eg:
-- 查询不在优惠范围内的商品数量
SELECT
COUNT(*)
FROM `goods` g
WHERE g.id NOT IN
( SELECT IFNULL(cg.goods_id,0)
FROM `coupon` coup
LEFT JOIN `coupon_goods` cg ON cg.coupon_id = coup.id
WHERE coup.user_type IN (1,2)
GROUP BY cg.goods_id
)
个人公众号:404Code,记录半个互联网人的技术与思考,感兴趣的可以关注.