MySQLのCASEステートメントがNULLを返すのはどのような条件の場合か?
MySQLのCASEステートメントは、指定した比較や条件がすべて偽(false)だった場合、ELSE句の後に記述された結果を返します。しかし、もしELSE句が存在しない場合はどうなるのでしょうか?その場合、CASEステートメントはNULLを返します。
これは初心者が見落としがちな重要な仕様です。集計クエリなどで意図しないNULLが表示される原因になることもあるため、動作を正しく理解しておきましょう。以下に具体的な例で示します。
例1:ELSE句がない場合の基本動作
mysql> Select CASE 100
-> WHEN 150 THEN 'It is matched'
-> WHEN 200 THEN 'It is not matched'
-> END As 'It Returns NULL';
+-----------------+
| It Returns NULL |
+-----------------+
| NULL |
+-----------------+
1 row in set (0.00 sec)この例では、評価対象の値「100」に対してWHEN句で指定された条件(150、200)がどちらも一致しません。さらにELSE句が存在しないため、CASEステートメント全体の結果としてNULLが返されます。
例2:実テーブルでのNULL返却パターン
次に、実際のテーブルを使った例を見てみましょう。以下のクエリでは「Students」テーブルのデータを使用しています。国ごとの学生数をカウントするSUM関数とCASEステートメントを組み合わせた集計です。
mysql> Select SUM(CASE WHEN country = 'USA' THEN 1 ELSE 0 END) AS USA,
-> SUM(CASE WHEN country = 'UK' THEN 1 ELSE 0 END) AS UK,
-> SUM(CASE WHEN country = 'INDIA' THEN 1 ELSE 0 END) AS INDIA,
-> SUM(CASE WHEN country = 'Russia' THEN 1 ELSE 0 END) AS Russia,
-> SUM(CASE WHEN country = 'France' THEN 1 ELSE 0 END) AS France,
-> SUM(CASE WHEN country = 'NZ' THEN 1 ELSE 0 END) AS NZ,
-> SUM(CASE WHEN country = 'Australia' THEN 1 ELSE 0 END) AS Australia,
-> SUM(CASE WHEN country = 'WI' THEN 1 END) AS WI
-> From Students;
+------+------+-------+--------+--------+------+-----------+------+
| USA | UK | INDIA | Russia | France | NZ | Australia | WI |
+------+------+-------+--------+--------+------+-----------+------+
| 2 | 1 | 2 | 1 | 1 | 1 | 1 | NULL |
+------+------+-------+--------+--------+------+-----------+------+
1 row in set (0.00 sec)この結果で注目すべき点は、「WI」列だけがNULLになっていることです。他の国のCASEステートメントにはELSE 0が記述されているため、該当する学生がいなくても「0」が返ります。一方、「WI」のCASEステートメントにはELSE句が書かれておらず、WI出身の学生が一人も存在しないため、条件が真になることがなく、結果としてSUM関数はNULLを返すことになります。
まとめ
- CASEステートメントは、どのWHEN条件も一致せず、かつELSE句が省略されている場合にNULLを返す。
- SUMなどの集計関数と組み合わせる際は、ELSE句を明示的に指定することで、意図しないNULLを防げる。
この仕様を把握しておくことで、SQLの集計処理における予期せぬNULLの発生を回避できます。
-
MySQLでTINYINT型カラムが「1以外」または「NULL」のレコードを取得する方法
MySQLでは、TINYINT型のカラムに対して「1以外の値」または「NULL」を含むレコードを抽出したいケースはよくあります。しかし、<> 1 の比較条件だけではNULLのレコードは取得できないため、IS NULL を組み合わせる必要があります。この記事では、具体的な手順をサンプルコードとともに解説します。 1. サンプルテーブルの作成 まず、TINYINT型のカラムを含むテーブルを作成します。 mysql> create table DemoTable -> ( -> EmployeeId int NOT NULL AUTO_INCREMEN
-
MySQLのCASE WHENステートメントで条件別のカウントを実行する方法
条件に応じてレコードをカウントしたい場合には、CASE WHENステートメントを活用すると便利です。この記事では、サンプルテーブルを作成し、SUM関数と組み合わせて条件別の件数を集計する手順を、実行結果つきでわかりやすく解説します。 1. サンプルテーブルの作成 まず、以下のコマンドでテーブルを作成しましょう。 mysql> create table DemoTable1910 ( FirstName varchar(20), Marks int ); Query OK, 0 rows affected (0.00 sec) 2. レコードの挿入 続い