MySQLのSELECTクエリで個々のフィールド値を任意のキーにマッピングする方法
MySQLでは、SELECTクエリ内でCASE文またはIF()関数を使用することで、特定のフィールドの値(例:0や1のブール値)を「ENABLED」「DISABLED」のような分かりやすい文字列キーへ変換して表示できます。本記事では、両方の方法の構文と実際の使用例を解説します。
方法1:CASE文を使う
CASE文を使うと、条件に応じて返す値を柔軟に制御できます。基本構文は以下のとおりです。
SELECT yourColumnName1,yourColumnName2,yourColumnName3,.........N
(
CASE WHEN yourColumnName = 1 THEN 'ENABLED'
ELSE 'DISABLED'
END
) AS anyVariableName
FROM yourTableName;
方法2:IF()関数を使う
よりシンプルな条件分岐であれば、IF()関数でも同じことが実現できます。構文は次のとおりです。
SELECT yourColumnName1,yourColumnName2,yourColumnName3,.........N ,IF(yourColumnName,'ENABLED','DISABLED') as anyVariableName FROM yourTableName;
動作確認用テーブルの作成
それでは、上記の構文を理解するためにサンプルテーブルを作成しましょう。テーブル作成のクエリは以下のとおりです。
mysql> create table MapKeys
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(20),
-> isActive boolean,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.65 sec)
次に、INSERT文を使ってテーブルにレコードを挿入します。
mysql> insert into MapKeys(Name,isActive) values('Larry',true);
Query OK, 1 row affected (0.13 sec)
mysql> insert into MapKeys(Name,isActive) values('David',false);
Query OK, 1 row affected (0.16 sec)
mysql> insert into MapKeys(Name,isActive) values('Mike',true);
Query OK, 1 row affected (0.14 sec)
mysql> insert into MapKeys(Name,isActive) values('Carol',false);
Query OK, 1 row affected (0.17 sec)
mysql> insert into MapKeys(Name,isActive) values('Sam',false);
Query OK, 1 row affected (0.15 sec)
mysql> insert into MapKeys(Name,isActive) values('Bob',true);
Query OK, 1 row affected (0.19 sec)
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from MapKeys;
実行結果は以下のとおりです。isActive列には0か1が格納されています。
+----+-------+----------+ | Id | Name | isActive | +----+-------+----------+ | 1 | Larry | 1 | | 2 | David | 0 | | 3 | Mike | 1 | | 4 | Carol | 0 | | 5 | Sam | 0 | | 6 | Bob | 1 | +----+-------+----------+ 6 rows in set (0.00 sec)
CASE文でキーをマッピングする
ここからが本題です。CASE文を使ってisActiveの値を「ENABLED」/「DISABLED」というキーにマッピングしてみましょう。
mysql> select Id,Name,
-> (
-> CASE WHEN isActive = 1 THEN 'ENABLED'
-> ELSE 'DISABLED'
-> END
-> ) AS Status
-> from MapKeys;
出力結果:
+----+-------+----------+ | Id | Name | Status | +----+-------+----------+ | 1 | Larry | ENABLED | | 2 | David | DISABLED | | 3 | Mike | ENABLED | | 4 | Carol | DISABLED | | 5 | Sam | DISABLED | | 6 | Bob | ENABLED | +----+-------+----------+ 6 rows in set (0.00 sec)
IF()関数で同じ結果を得る
同様の処理は、IF()関数を使っても簡単に実現できます。第1引数の条件が真なら第2引数の値を、偽なら第3引数の値を返します。
mysql> select Id,Name,if(isActive,'ENABLED','DISABLED') as Status from MapKeys;
出力結果:
+----+-------+----------+ | Id | Name | Status | +----+-------+----------+ | 1 | Larry | ENABLED | | 2 | David | DISABLED | | 3 | Mike | ENABLED | | 4 | Carol | DISABLED | | 5 | Sam | DISABLED | | 6 | Bob | ENABLED | +----+-------+----------+ 6 rows in set (0.00 sec)
まとめ
このように、MySQLのSELECTクエリではCASE文やIF()関数を活用することで、生の数値データ(0/1など)をユーザーにとって読みやすいステータス表現に変換できます。単純な二択の分岐ならIF()関数が簡潔でおすすめですが、3つ以上の条件や複雑な判定が必要な場合はCASE文の方が柔軟に対応できます。用途に応じて使い分けるとよいでしょう。
-
JavaでMySQLのSELECTクエリにPreparedStatement(プリペアドステートメント)を使う方法
executeQuery()メソッドの基本的な使い方JavaからMySQLに対してSELECTクエリを実行する場合は、PreparedStatementオブジェクトのexecuteQuery()メソッドを使用します。基本構文は以下の通りです。yourPreparedStatementObject = yourConnectionObject.prepareStatement(yourQueryName);yourResultSetObject = yourPreparedStatementObject.executeQuery();それでは、実際にサンプルデータベース「sample」を使って手
-
MySQLでテーブルに存在しない値だけを抽出する方法(UNION ALLとNOT EXISTSの活用)
MySQLでテーブルに存在しない値を照会するには? MySQLで「テーブルにまだ登録されていない値だけ」を取得したい場合、UNION ALLとWHERE NOT EXISTSを組み合わせるのが有効です。サブクエリで候補となる値をUNION ALLで列挙し、NOT EXISTSによって既にテーブル内に存在する値を除外することで、存在しない値のみを抽出できます。 ここでは、実際の手順をサンプルコードとともに解説します。 1. サンプルテーブルを作成する まず、自動採番(AUTO_INCREMENT)のカラムを持つテーブルを作成します。 mysql> create table DemoTab