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つのクエリ内で完結できるため、中間状態によるデータ破壊のリスクなく、安全にスワップ処理を行えます。
-
MySQLで文字列や数値が混在するカラムから特定のレコードを取得する方法
文字列・数値・特殊文字が混在するカラムから特定のレコードを取得したい場合は、ORDER BY CAST() を活用すると便利です。この記事では、SUBSTRING() 関数と組み合わせて、「指定した文字列で始まるレコードの中から、数値部分が最も大きいもの」を抽出する方法を、実際のSQL例とともにわかりやすく解説します。 サンプルテーブルの作成 まず、CREATE TABLE文でテーブルを作成します。 mysql> create table DemoTable2006 ( UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, Us
-
MySQLの正規表現(REGEXP)で特定パターンの列値だけを更新する方法
UPDATE文とREGEXPを組み合わせた条件付き更新 文字列・数値・特殊文字などが混在する列から、特定のパターンに一致する値だけを更新したい場合には、UPDATEコマンドとREGEXP演算子を組み合わせるのが効果的です。ここでは、数値のみで構成される行を判別し、先頭に「Street」という文字列を連結して更新する例を解説します。 1. サンプルテーブルの作成 まず、次のようにテーブルを作成します。 mysql> create table DemoTable2023 -> ( -> StreetNumber varchar(100) -> );