日期:2014-05-16  浏览次数:20838 次

关于mysql函数 count与sum过滤行异常行为的问题
select count(null) from t1; 返回0, 这符合预期, 因为count的传入的值不能为null

select count(x<200) from t1; 返回总行数, 无法过滤行;

select count(x<200 or null) from t1; 可以统计出x小于200的行的数量

select count(x<200 and null) from t1; 返回127399, 不知道这个值是怎么得出来的

表为innodb, 共计130000条记录
-----------------------------------------------
经过测试 select 1454 and null 的返回值为null, 为什么第一条sql与最后一条sql具有不同的结果?


但是可以使用 select sum(x<200) from t1统计小于200的值的和

mysql对函数中的条件的处理有什么样的规律


往各位大哥不吝赐教



------解决方案--------------------
select count(ifnull(columns,0,1)) from t1; 返回0, 这符合预期, 因为count的传入的值不能为null

select count(case when x<100 then 1 else 0 end) from t1; 返回总行数, 无法过滤行;

select count(case when x<200 or x is null then 1 else 0 end) from t1; 可以统计出x小于200的行的数量

select count(这个逻辑有问题) from t1; 返回127399, 不知道这个值是怎么得出来
------解决方案--------------------
可以算是MYSQL的一个BUG了吧。 理论上应该是返回 0,但显然MYSQL中有什么问题了。这个需要去分析MYSQL的源代码。