【MySQL】SELECT句でのCOUNTの挙動調査

スポンサーリンク

バグを出しそうになったので、調査メモを残します。

SELECT句でのCOUNTをしたら想定外の結果になりました。

以下のテーブルがあります。

mysql> select * from tests;
+----+--------------------+
| id | name |
+----+--------------------+
| 0 | ちょめちょめ |
| 1 | ちょめちょめ |
| 2 | きゃんちょめ |
+----+--------------------+

「ちょめちょめ」をカウントします。(2が返ってきてほしい)

mysql> select count(name = "ちょめちょめ") from tests;
+------------------------------------+
| count(name = "ちょめちょめ") |
+------------------------------------+
| 3 |
+------------------------------------+

!?2が返ってこない。

対応策

以下のように「or null」を追加してあげればいいのです。

mysql> select count(name = "ちょめちょめ" or null) from tests;
+--------------------------------------------+
| count(name = "ちょめちょめ" or null) |
+--------------------------------------------+
| 2 |
+--------------------------------------------+

 

次から調査内容を紹介します。

調査結果

単純に式の結果がTRUE or FALSEではなく、0 or 1で戻ってきたため、に0もカウントしていました。

 

次のSQLを発行すると、「きゃんちょめ」が「0」で戻ってきていることがわかります。

mysql> select name,name = "ちょめちょめ" from tests;
+--------------------+-----------------------------+
| name | name = "ちょめちょめ" |
+--------------------+-----------------------------+
| ちょめちょめ | 1 |
| ちょめちょめ | 1 |
| きゃんちょめ | 0 |
+--------------------+-----------------------------+

 

そのため、COUNT関数を使うと3になるんですね!

なぜ「or null」で対応できるのか

MySQLの仕様として、オペランドにnullがある場合は、「0」をNULLとし、「0」以外を1とするそうです。

nullはカウントされませんからね!

そのため、「or null」を入れてあげる必要があるのです。

 

念のためnullがCOUNTされないことの確認

mysql> select count(‘aa’) from dual;
+————-+
| count(‘aa’) |
+————-+
| 1 |
+————-+

mysql> select count(null) from dual;
+————-+
| count(null) |
+————-+
| 0 |
+————-+

大丈夫そうですね!

タイトルとURLをコピーしました