2

非常に単純なケースで問題を再現できます..
説明1 つの列を
持つ非常に単純なテーブルがあります。my_tablecolumn1

create table my_table (column1 varchar(58));

この列にはほとんど値がありませんが、これNULLもその 1 つです。

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

問題
クエリを実行しようとすると、 group by column1すべてNULLの s をグループ化することで期待どおりの結果が得られます。ただし、次のような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 との比較では true または false の結果が生成されず、代わりに NULL の結果が生成されるためです。したがって、条件は NULL とcolumn1 <> 'value1'評価されるcolumn1ため、NULL 値は選択されません。

coalesceto testなどの関数を使用して、これを回避できます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 に答える