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

MySQLでCASE文を使って「a」と「b」の値を一括で入れ替える(スワップする)方法

MySQLのテーブル内で、'a' のレコードを 'b' に、'b' のレコードを 'a' に同時に更新したい場合には、CASE文を使うのが最もシンプルで確実な方法です。ここでは、実際の手順をサンプルコードとともに解説します。

1. サンプルテーブルを作成する

まずは動作確認用のテーブルを作成しましょう。ここでは char(1) 型のカラムを1つだけ持つシンプルなテーブルを用意します。

mysql> create table DemoTable
(
    Value char(1)
);
Query OK, 0 rows affected (1.21 sec)

2. テストデータを挿入する

次に、INSERT文を使って 'a''b' を混在させたレコードを登録します。

mysql> insert into DemoTable values('a');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('b');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('a');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('a');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('b');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('a');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('b');
Query OK, 1 row affected (0.13 sec)

3. 現在のデータを確認する

SELECT文で全レコードを表示し、更新前の状態を確認しておきましょう。

mysql> select *from DemoTable;

実行結果は以下の通りです。

+-------+
| Value |
+-------+
| a     |
| b     |
| a     |
| a     |
| b     |
| a     |
| b     |
+-------+
7 rows in set (0.00 sec)

4. CASE文を使って「a」と「b」を入れ替える

いよいよ本題です。以下のようにUPDATE文とCASE文を組み合わせることで、'a''b' に、'b''a' に一括で入れ替えることができます。

mysql> update DemoTable set Value=case when Value='a' then 'b' else 'a' end;
Query OK, 7 rows affected (0.17 sec)
Rows matched: 7 Changed: 7 Warnings: 0

ポイント: 一時的な中間値を使わずに済むのがCASE文の利点です。もし単純に2段階のUPDATE文(まず 'a''b' に変更し、その後 'b''a' に変更する)で処理すると、最初のUPDATEで変換された値まで再び書き換えられてしまうため、正しくスワップできません。CASE文なら1回のUPDATEで条件分岐しながら更新できるため、この問題を回避できます。

5. 更新結果を確認する

再度SELECT文を実行して、値が正しく入れ替わったかどうかを確認します。

mysql> select *from DemoTable;

実行結果を見ると、すべての 'a''b' に、'b''a' に入れ替わっていることがわかります。

+-------+
| Value |
+-------+
| b     |
| a     |
| b     |
| b     |
| a     |
| b     |
| a     |
+-------+
7 rows in set (0.00 sec)

まとめ

MySQLで列の値を入れ替えたい場合は、CASE WHEN を使ったUPDATE文が最適です。条件分岐を1つのクエリ内で完結できるため、中間状態によるデータ破壊のリスクなく、安全にスワップ処理を行えます。

  1. MySQLで文字列や数値が混在するカラムから特定のレコードを取得する方法

    文字列・数値・特殊文字が混在するカラムから特定のレコードを取得したい場合は、ORDER BY CAST() を活用すると便利です。この記事では、SUBSTRING() 関数と組み合わせて、「指定した文字列で始まるレコードの中から、数値部分が最も大きいもの」を抽出する方法を、実際のSQL例とともにわかりやすく解説します。 サンプルテーブルの作成 まず、CREATE TABLE文でテーブルを作成します。 mysql> create table DemoTable2006 ( UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, Us

  2. MySQLの正規表現(REGEXP)で特定パターンの列値だけを更新する方法

    UPDATE文とREGEXPを組み合わせた条件付き更新 文字列・数値・特殊文字などが混在する列から、特定のパターンに一致する値だけを更新したい場合には、UPDATEコマンドとREGEXP演算子を組み合わせるのが効果的です。ここでは、数値のみで構成される行を判別し、先頭に「Street」という文字列を連結して更新する例を解説します。 1. サンプルテーブルの作成 まず、次のようにテーブルを作成します。 mysql> create table DemoTable2023 -> ( -> StreetNumber varchar(100) -> );