MySQLのCASE式でOR条件を使う方法をわかりやすく解説
MySQLのCASE式では、WHEN句の中でOR演算子を使うことで、複数の条件を組み合わせた分岐処理を実装できます。特に「値が0であるまたはNULLである」といった判定を行いたい場合に便利です。
OR条件を使ったCASE式の基本構文
MySQLのCASE式でOR条件を使用する場合の基本構文は以下のとおりです。
SELECT yourColumnName1,.....N , CASE WHEN yourColumnName2=0 OR yourColumnName2 IS NULL THEN 'yourMessage1' ELSE 'yourMessage2' END AS yourAliasName FROM yourTableName;
この構文では、指定したカラムの値が0もしくはNULLの場合に1つ目のメッセージを返し、それ以外の場合には2つ目のメッセージを返します。NULL判定には必ずIS NULLを使用する点がポイントです。
サンプルテーブルを作成する
それでは、上記の構文を実際に試すためにテーブルを作成しましょう。テーブル作成用のクエリは次のとおりです。
mysql> create table ReservationSystems - > ( - > Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, - > Name varchar(20), - > isSeatConfirmed tinyint - > ); Query OK, 0 rows affected (0.61 sec)
ここでは、名前(Name)と座席の確定状況(isSeatConfirmed)を管理する予約システム向けのテーブルを用意しました。isSeatConfirmedカラムはtinyint型のため、NULL値も格納可能です。
レコードを挿入する
続いて、INSERTコマンドを使ってテーブルにいくつかのレコードを挿入します。クエリは以下のとおりです。
mysql> insert into ReservationSystems(Name,isSeatConfirmed) values('Larry',0);
Query OK, 1 row affected (0.12 sec)
mysql> insert into ReservationSystems(Name,isSeatConfirmed) values('Bob',1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into ReservationSystems(Name,isSeatConfirmed) values('Mike',NULL);
Query OK, 1 row affected (0.14 sec)
mysql> insert into ReservationSystems(Name,isSeatConfirmed) values('David',1);
Query OK, 1 row affected (0.17 sec)
mysql> insert into ReservationSystems(Name,isSeatConfirmed) values('Carol',0);
Query OK, 1 row affected (0.19 sec)
mysql> insert into ReservationSystems(Name,isSeatConfirmed) values('James',1);
Query OK, 1 row affected (0.11 sec)この時点で、「0」「1」「NULL」の3種類の値が混在したデータが登録されています。
テーブルの内容を確認する
SELECT文を使って、テーブル内のすべてのレコードを表示してみましょう。
mysql> select *from ReservationSystems;
実行結果は以下のとおりです。
+----+-------+-----------------+ | Id | Name | isSeatConfirmed | +----+-------+-----------------+ | 1 | Larry | 0 | | 2 | Bob | 1 | | 3 | Mike | NULL | | 4 | David | 1 | | 5 | Carol | 0 | | 6 | James | 1 | +----+-------+-----------------+ 6 rows in set (0.00 sec)
CASE式にOR条件を適用して実行する
準備が整いましたので、ここからが本題です。OR条件を組み合わせたMySQLのCASE式を実行してみましょう。
mysql> select Name, - > CASE WHEN isSeatConfirmed=0 or isSeatConfirmed IS NULL THEN 'YOUR SEAT IS NOT CONFIRMED' - > ELSE 'YOUR SEAT IS CONFIRMED' - > END AS SEATCONFIRMSTATUS - > FROM ReservationSystems;
このクエリでは、isSeatConfirmedが0であるかNULLである場合に「YOUR SEAT IS NOT CONFIRMED(座席は未確定)」と表示され、それ以外(値が1の場合)には「YOUR SEAT IS CONFIRMED(座席は確定済み)」と表示されます。
実行結果は以下のとおりです。
+-------+----------------------------+ | Name | SEATCONFIRMSTATUS | +-------+----------------------------+ | Larry | YOUR SEAT IS NOT CONFIRMED | | Bob | YOUR SEAT IS CONFIRMED | | Mike | YOUR SEAT IS NOT CONFIRMED | | David | YOUR SEAT IS CONFIRMED | | Carol | YOUR SEAT IS NOT CONFIRMED | | James | YOUR SEAT IS CONFIRMED | +-------+----------------------------+ 6 rows in set (0.00 sec)
結果のポイント
注目すべきは「Mike」の行です。isSeatConfirmedの値はNULLですが、WHEN isSeatConfirmed=0 OR isSeatConfirmed IS NULLというOR条件のおかげで、正しく「YOUR SEAT IS NOT CONFIRMED」と判定されています。もしIS NULLの条件を省略すると、NULLは=0の比較ではマッチしないため、意図しない結果になってしまうので注意してください。
このように、CASE式のWHEN句にOR条件を組み合わせることで、0やNULLなど複数の状態をまとめて判定でき、可読性の高いSQLを書くことができます。
-
MySQLで別の列の条件に基づいて列の値を合計する方法
MySQLである列の値を、別の列の条件(例えば入社日の「年」や「月」)が同じレコードごとに合計したい場合は、集計関数SUM()とGROUP BY句を組み合わせることで実現できます。 ここでは、従業員名(EmployeeName)、入社日(JoiningDate)、給与(Salary)を持つテーブルを例に、月ごとの給与合計を求める手順を解説します。 1. サンプルテーブルの作成 まず、以下のコマンドでテーブルを作成します。 mysql> create table DemoTable -> ( &nbs
-
MySQLのCONCAT_WS()関数で文字列を連結しながら条件に一致する行を抽出する方法
MySQLのCONCAT_WS()関数とはMySQLでは、CONCAT_WS()関数を使用することで、複数のカラムや値を指定した区切り文字で連結できます。さらにWHERE句と組み合わせれば、条件に一致する行だけを抽出しながら、読みやすい形式の文字列として出力することも可能です。この記事では、実際にテーブルを作成し、CONCAT_WS()と条件指定を組み合わせたクエリの実行例を順番に解説します。サンプルテーブルの作成まず、ユーザー情報を格納するテーブル「demo38」を作成しましょう。mysql> create table demo38-> (-> user_id int,-&