MySQLのCASE文でcolumn1がNULLの場合にNULLを返し、それ以外はcolumn2を返す方法
MySQLで「あるカラムがNULLの場合はNULLを返し、それ以外の場合は別のカラムの値を返す」といった条件分岐を実現したい場合は、CASE文を利用します。この記事では、「Marks1がNULLであればNULLを返し、NULLでなければMarks2の値を返す」という処理を、実際のサンプルコードとともに解説します。
サンプルテーブルの作成
まず、以下のコマンドでテーブルを作成します。
mysql> create table DemoTable -> ( -> Name varchar(20), -> Marks1 int, -> Marks2 int -> ); Query OK, 0 rows affected (0.72 sec)
テストデータの挿入
次に、insertコマンドを使ってテーブルにいくつかのレコードを挿入します。
mysql> insert into DemoTable values('Chris',45,null);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('David',null,78);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Bob',67,98);
Query OK, 1 row affected (0.14 sec)
テーブルの内容を確認する
select文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行すると、次のような出力が得られます。
+-------+--------+--------+ | Name | Marks1 | Marks2 | +-------+--------+--------+ | Chris | 45 | NULL | | David | NULL | 78 | | Bob | 67 | 98 | +-------+--------+--------+ 3 rows in set (0.00 sec)
CASE WHENを使った条件分岐クエリ
以下が、CASE WHENを実装したクエリです。「Marks1 is null」の条件を評価し、NULLの場合はnullを返し、それ以外の場合はMarks2の値を返します。
mysql> select *, -> (case when Marks1 is null then null else Marks2 end ) as Value -> from DemoTable;
このクエリの実行結果は以下のとおりです。
+-------+--------+--------+-------+ | Name | Marks1 | Marks2 | Value | +-------+--------+--------+-------+ | Chris | 45 | NULL | NULL | | David | NULL | 78 | NULL | | Bob | 67 | 98 | 98 | +-------+--------+--------+-------+ 3 rows in set (0.00 sec)
結果のポイント
出力結果を確認すると、動作は次のようになっています。
- David(Marks1がNULL):条件に該当するため、ValueにはNULLが返される。
- Chris(Marks1に値があり、Marks2がNULL):else句でMarks2の値がそのまま返されるため、結果はNULLになる。
- Bob(両方に値がある):Marks2の値である98がValueとして返される。
なお、単に「最初に見つかった非NULLの値」を取得したいだけの場合は、COALESCE関数を使うという選択肢もあります。しかし、今回のように「特定のカラムがNULLかどうかを判定し、条件に応じて異なる値を返したい」ケースでは、CASE文の方が柔軟にロジックを記述できるのでおすすめです。
-
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. レコードの挿入 続い
-
MySQLでNULLの場合のみ列を更新し、両方の列がNULLでなければ何もしない方法
列がNULLの場合にのみ新しい値を更新し、すでに値が入っている列はそのまま維持したい——こんな要件はMySQLでよく発生します。このような場合、IF()関数とIS NULL演算子を組み合わせることで簡単に実現できます。両方の列がNULLでない行には、実質的に何も変更が加わりません。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable1976 ( FirstName varchar(20), LastName varchar(20) );Query OK, 0 rows affected (0.