2

我可以用一个非常简单的案例来复制我的问题。
解释
我有一个非常简单的表my_table,只有一列column1

create table my_table (column1 varchar(58));

我对这个专栏的价值观很少,NULL也是其中之一。

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

问题
当我尝试查询时, 它通过将所有s 组合在一起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条件来解决这个问题,但是在我原来的案例中添加这个条件真的很痛苦。

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

4

3 回答 3

3

Null 的意思是“一个值,但我不知道它是什么”。

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

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

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

于 2012-07-16T11:23:14.267 回答
3

这是因为任何与 NULL 的比较都不会产生真假结果,而是产生 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;
于 2012-07-16T11:24:45.707 回答
1

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

select count(1) as value_count, column1 from my_table where ifnull(column1,'nullvalue') <> 'value1' group by column1;
于 2012-07-16T11:20:31.757 回答