我能用一个非常简单的案例来复制我的问题。
的说明
我有一个非常简单的表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;
它忽略了value1
和NULL
,我希望只忽略value1
。
通过这个简单的案例,我可以通过添加OR
条件来解决这个问题,但是在我的原始案例中添加这个条件真是太痛苦了。
有人可以更好地向我解释为什么会出现这种行为以及如何解决这个问题?
答案 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;