MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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句を組み合わせることで、特定の条件に合致する行だけを安全かつ柔軟に一括置換できます。フラグの反転やステータスの一括変更など、実務でもよく使われるテクニックなので、ぜひ覚えておきましょう。

  1. MySQLのREPLACE()関数でテーブル内の文字を置き換える方法

    MySQLでは、REPLACE()関数を使うことで、文字列の中から特定の1文字だけを簡単に置き換えることができます。この記事では、実際にテーブルを作成し、UPDATE文とREPLACE()関数を組み合わせて文字を置き換える手順を、サンプルコード付きでわかりやすく解説します。 1. サンプルテーブルを作成する まず、置き換え対象となるテーブルを作成します。 mysql> create table DemoTable -> ( -> Name varchar(20) -> ); Query OK, 0 rows affected (0.69 sec

  2. MySQLでテーブルに存在しない値だけを抽出する方法(UNION ALLとNOT EXISTSの活用)

    MySQLでテーブルに存在しない値を照会するには? MySQLで「テーブルにまだ登録されていない値だけ」を取得したい場合、UNION ALLとWHERE NOT EXISTSを組み合わせるのが有効です。サブクエリで候補となる値をUNION ALLで列挙し、NOT EXISTSによって既にテーブル内に存在する値を除外することで、存在しない値のみを抽出できます。 ここでは、実際の手順をサンプルコードとともに解説します。 1. サンプルテーブルを作成する まず、自動採番(AUTO_INCREMENT)のカラムを持つテーブルを作成します。 mysql> create table DemoTab