SQL统计confirmed_at列空值与非空值结果不符,求助排查问题
问题原因及修复方案
你的问题出在CASE表达式判断NULL值的方式错误。SQL里NULL是特殊值,不能用case column when null这种等价于column = null的写法来判断——因为NULL和任何值(包括自身)比较的结果都是UNKNOWN,永远不会匹配成功,所以你的SUM(case when null then 1 else 0 end)永远统计不到1,自然结果里Null Values是0,Non-null values被错误统计成4。
修正后的SQL
SELECT date(`user`.`created_at`) AS `Date`, SUM(case when `user`.`confirmed_at` IS NULL then 1 else 0 end) AS `Null values`, SUM(case when `user`.`confirmed_at` IS NOT NULL then 1 else 0 end) AS `Non-null values` FROM `user` GROUP BY date(`user`.`created_at`);
或者也可以用更简洁的写法,利用COUNT函数的特性:COUNT(column)会自动忽略NULL值,COUNT(*)统计所有行数,所以也可以写成:
SELECT date(`user`.`created_at`) AS `Date`, COUNT(*) - COUNT(`user`.`confirmed_at`) AS `Null values`, COUNT(`user`.`confirmed_at`) AS `Non-null values` FROM `user` GROUP BY date(`user`.`created_at`);
这两种写法都能得到你预期的结果:
Date | Null Values | non-null values 1/12/2022 | 1 | 3
内容的提问来源于stack exchange,提问作者Shaho
相关产品推荐
相关产品推荐

