使用WHERE与COUNT查询NULL值时SQL返回错误值的问题
问题原因与解决方案
这是SQL里非常常见的两个误区,我来一步步帮你捋清楚:
1. 为什么category_id = NULL无法匹配到数据?
在SQL的逻辑里,NULL代表的是未知的、不存在的值,它不能用普通的比较运算符(=、!=、<等)来判断。当你写category_id = NULL时,这个表达式的结果既不是TRUE也不是FALSE,而是UNKNOWN——而WHERE子句只会保留判断结果为TRUE的行,所以你的条件根本筛选不到任何数据,自然返回0。
正确判断NULL的方式是用IS NULL(判断是NULL)或者IS NOT NULL(判断不是NULL)。
2. 为什么即使筛选对了,COUNT(category_id)还是可能返回0?
COUNT(column_name)的逻辑是统计该列不为NULL的行数。如果你的WHERE条件已经筛选出category_id IS NULL的行,那这些行的category_id本身就是NULL,COUNT(category_id)会直接忽略这些值,结果还是0,这显然不是你想要的。
要统计符合条件的记录总数,你应该用:
COUNT(*):统计所有符合WHERE条件的行,不管任何列的值是否为NULL,语义最清晰COUNT(1):和COUNT(*)效果几乎一致,用常量1代替整行统计,性能上差别极小- 或者
COUNT(其他非NULL的列):比如如果表有主键列product_id,可以写COUNT(product_id),因为主键不会为NULL,能准确统计行数
最终正确的SQL语句
结合这两点,你需要写成这样:
-- 推荐写法,语义清晰 SELECT COUNT(*) FROM products WHERE category_id IS NULL; -- 等价写法 SELECT COUNT(1) FROM products WHERE category_id IS NULL;
如果非要用COUNT(category_id)验证(其实没必要),可以用CASE表达式把NULL转成非NULL值:
SELECT COUNT(CASE WHEN category_id IS NULL THEN 1 END) FROM products;
内容的提问来源于stack exchange,提问作者Leonardo Eiki Abe
相关产品推荐
相关产品推荐

