MySQLでテーブルの値を置き換える方法|CASE文を使ったUPDATEの実例
MySQLのテーブル内の値を別の値に置き換えたい場合、CASE文を使ったUPDATE文を利用するのが効果的です。本記事では、サンプルテーブルを実際に作成しながら、値を入れ替える具体的な手順を段階的に解説していきます。
1. サンプルテーブルを作成する
まず、動作確認用のテーブルを作成します。以下がテーブル作成用のクエリです。
mysql> create table replaceValueDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(10),
-> isGreaterThan18 varchar(10)
-> );
Query OK, 0 rows affected (0.49 sec)
このテーブルは、自動採番される主キーの「Id」、名前を格納する「Name」、18歳以上かどうかを示す「isGreaterThan18」の3つのカラムで構成されています。
2. テストデータを挿入する
続いて、INSERTコマンドでレコードを挿入していきます。実行するクエリは以下の通りです。
mysql> insert into replaceValueDemo(Name,isGreaterThan18) values('John','YES');
Query OK, 1 row affected (0.24 sec)
mysql> insert into replaceValueDemo(Name,isGreaterThan18) values('Carol','NO');
Query OK, 1 row affected (0.16 sec)
mysql> insert into replaceValueDemo(Name,isGreaterThan18) values('Mike','YES');
Query OK, 1 row affected (0.20 sec)
mysql> insert into replaceValueDemo(Name,isGreaterThan18) values('Bob','YES');
Query OK, 1 row affected (0.17 sec)
mysql> insert into replaceValueDemo(Name,isGreaterThan18) values('Larry','NO');
Query OK, 1 row affected (0.09 sec)
mysql> insert into replaceValueDemo(Name,isGreaterThan18) values('David','NO');
Query OK, 1 row affected (0.11 sec)
mysql> insert into replaceValueDemo(Name,isGreaterThan18) values('James','DONOTKNOW');
Query OK, 1 row affected (0.14 sec)
mysql> insert into replaceValueDemo(Name,isGreaterThan18) values('Robert','DONOTKNOW');
Query OK, 1 row affected (0.13 sec)
3. 挿入したデータを確認する
SELECT文ですべてのレコードを表示して、現在の状態を確認しておきましょう。
mysql> select *from replaceValueDemo;
実行結果は以下の通りです。
+----+--------+-----------------+
| Id | Name | isGreaterThan18 |
+----+--------+-----------------+
| 1 | John | YES |
| 2 | Carol | NO |
| 3 | Mike | YES |
| 4 | Bob | YES |
| 5 | Larry | NO |
| 6 | David | NO |
| 7 | James | DONOTKNOW |
| 8 | Robert | DONOTKNOW |
+----+--------+-----------------+
8 rows in set (0.00 sec)
現時点では、「YES」「NO」に加えて「DONOTKNOW」という値も混在しているのが分かります。
4. CASE文で値を置き換える
ここからが本題です。「YES」を「NO」に、「NO」を「YES」に入れ替えるためのクエリが以下になります。
mysql> update replaceValueDemo set isGreaterThan18=case when isGreaterThan18='YES' THEN 'NO' ELSE 'YES' END
-> where isGreaterThan18 IN('YES','NO');
Query OK, 6 rows affected (0.19 sec)
Rows matched: 6 Changed: 6 Warnings: 0
このクエリのポイントは次の2点です。
- CASE文による条件分岐:isGreaterThan18が「YES」であれば「NO」に変換し、それ以外(「NO」)であれば「YES」に変換します。
- WHERE句による対象の絞り込み:IN('YES','NO')を指定することで、「DONOTKNOW」のレコードは更新対象から除外され、元の値が保持されます。
5. 更新後のデータを確認する
もう一度テーブルの内容をSELECT文で確認してみましょう。
mysql> select *from replaceValueDemo;
値が置き換わった後の出力結果は以下の通りです。
+----+--------+-----------------+
| Id | Name | isGreaterThan18 |
+----+--------+-----------------+
| 1 | John | NO |
| 2 | Carol | YES |
| 3 | Mike | NO |
| 4 | Bob | NO |
| 5 | Larry | YES |
| 6 | David | YES |
| 7 | James | DONOTKNOW |
| 8 | Robert | DONOTKNOW |
+----+--------+-----------------+
8 rows in set (0.00 sec)
ご覧のとおり、「YES」と「NO」の値が完全に入れ替わり、「DONOTKNOW」のレコード(Id: 7、8)はそのまま維持されています。このようにCASE文とWHERE句を組み合わせることで、特定の条件に合致する行だけを安全かつ柔軟に一括置換できます。フラグの反転やステータスの一括変更など、実務でもよく使われるテクニックなので、ぜひ覚えておきましょう。
-
MySQLのREPLACE()関数でテーブル内の文字を置き換える方法
MySQLでは、REPLACE()関数を使うことで、文字列の中から特定の1文字だけを簡単に置き換えることができます。この記事では、実際にテーブルを作成し、UPDATE文とREPLACE()関数を組み合わせて文字を置き換える手順を、サンプルコード付きでわかりやすく解説します。 1. サンプルテーブルを作成する まず、置き換え対象となるテーブルを作成します。 mysql> create table DemoTable -> ( -> Name varchar(20) -> ); Query OK, 0 rows affected (0.69 sec
-
MySQLでテーブルに存在しない値だけを抽出する方法(UNION ALLとNOT EXISTSの活用)
MySQLでテーブルに存在しない値を照会するには? MySQLで「テーブルにまだ登録されていない値だけ」を取得したい場合、UNION ALLとWHERE NOT EXISTSを組み合わせるのが有効です。サブクエリで候補となる値をUNION ALLで列挙し、NOT EXISTSによって既にテーブル内に存在する値を除外することで、存在しない値のみを抽出できます。 ここでは、実際の手順をサンプルコードとともに解説します。 1. サンプルテーブルを作成する まず、自動採番(AUTO_INCREMENT)のカラムを持つテーブルを作成します。 mysql> create table DemoTab