mysql在使用group by和where condition时忽略NULL

时间:2012-07-16 11:14:50

标签: mysql null group-by

我能用一个非常简单的案例来复制我的问题。
说明
我有一个非常简单的表my_table,其中一列column1

create table my_table (column1 varchar(58));

此列的值很少,NULL也是其中之一。

insert into my_table (column1) values ('value1'), ('value1'), ('value2'), (null), ('value2');

问题
当我尝试查询group by column1时,它通过将所有NULL组合在一起来提供预期结果。但是,如果我在where上添加column1条款,例如

select count(1) as value_count, column1 from my_table where column1 <> 'value1' group by column1;

它忽略了value1NULL,我希望只忽略value1

通过这个简单的案例,我可以通过添加OR条件来解决这个问题,但是在我的原始案例中添加这个条件真是太痛苦了。

有人可以更好地向我解释为什么会出现这种行为以及如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

Null表示“一个值,但我不知道它是什么”。

column1 <> 'value1'也是吗?如果column1为null,那么“是一个值,但我不知道它是什么,不等于'value1'”?

显然答案是“我不知道。我不知道它的价值是什么”。

where子句包含的唯一行是那些通过where子句测试的行。我们不知道这一行是否通过了测试,所以它不会包含在查询中。

答案 1 :(得分:3)

这是因为与NULL的任何比较都不会产生true或false结果,而是产生NULL结果。因此,条件column1 <> 'value1'计算为NULL,column1为NULL,因此不会选择NULL值。

您可以使用coalesce之类的功能测试column1来解决这个问题 - 就像这样:

select count(1) as value_count, column1 
from my_table 
where coalesce(column1,'') <> 'value1' 
group by column1;

答案 2 :(得分:1)

您可以尝试在谓词中使用MySQL IFNULL

select count(1) as value_count, column1 from my_table where ifnull(column1,'nullvalue') <> 'value1' group by column1;