MySQLでカンマ区切りの数値を月名に変換する方法|FIND_IN_SET()とCASE文の活用
MySQLでは、カンマ区切りで保存された数値データ(例:「2,4,6」)を、読みやすい月名の形式(例:「February,April,June」)に変換したいケースがあります。本記事では、FIND_IN_SET()関数とCASE文を組み合わせることで、カンマ区切りの数値を月名に置き換える方法を、サンプルコード付きでわかりやすく解説します。
1. サンプルテーブルの作成
まず、月の数値をカンマ区切りの文字列として格納するテーブルを作成します。
mysql> create table DemoTable1629
-> (
-> Month varchar(100)
-> );
Query OK, 0 rows affected (0.64 sec)
2. テストデータの挿入
次に、INSERT文でサンプルデータを3件登録します。
mysql> insert into DemoTable1629 values('2,4,6');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1629 values('1,3,5,12');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1629 values('7,8,9,10');
Query OK, 1 row affected (0.15 sec)3. 登録データの確認
SELECT文で、登録されたデータを確認しておきましょう。
mysql> select * from DemoTable1629;
実行すると、次のような結果が表示されます。
+----------+
| Month |
+----------+
| 2,4,6 |
| 1,3,5,12 |
| 7,8,9,10 |
+----------+
3 rows in set (0.00 sec)
4. カンマ区切りの数値を月名に変換するクエリ
ここが本記事のメインです。カンマ区切りの数値を月名に置き換えるには、以下のクエリを使用します。
mysql> select trim(trailing ',' from concat(
-> CASE WHEN FIND_IN_SET(1, Month) THEN 'January,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(2, Month) THEN 'February,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(3, Month) THEN 'March,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(4, Month) THEN 'April,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(5, Month) THEN 'May,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(6, Month) THEN 'June,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(7, Month) THEN 'July,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(8, Month) THEN 'August,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(9, Month) THEN 'September,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(10,Month) THEN 'October,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(11,Month) THEN 'November,' ELSE '' END,
-> CASE WHEN FIND_IN_SET(12,Month) THEN 'December,' ELSE '' END
-> )) as MonthName
-> from DemoTable1629;
このクエリのポイントは以下の3つです。
- FIND_IN_SET()関数:第1引数の数値が、第2引数のカンマ区切り文字列内に存在するかどうかを判定します。存在すれば1、しなければ0を返します。
- CASE文:該当する月が見つかれば「月名,」を、見つからなければ空文字を返します。
- CONCAT()とTRIM():すべてのCASE文の結果を連結した後、
trim(trailing ',' from ...)で末尾に残った余分なカンマを取り除きます。
5. 実行結果
クエリを実行すると、次のように数値が月名に変換されて表示されます。
+------------------------------+
| MonthName |
+------------------------------+
| February,April,June |
| January,March,May,December |
| July,August,September,October|
+------------------------------+
3 rows in set (0.04 sec)
補足:設計上の注意点
なお、複数の値をカンマ区切りで1つのカラムに保存する設計は、データベースの第一正規化の観点からは推奨されません。インデックスが効きにくく、検索や集計のパフォーマンスが低下する原因となります。実際のシステムでは、中間テーブル(関連テーブル)を作成してJOINで月名を取得する方が、保守性・拡張性の面で優れています。
ただし、既存システムの改修や一時的なデータ変換、レポート出力など、やむを得ない状況では、本記事で紹介したFIND_IN_SET()とCASE文を組み合わせたテクニックが非常に役立ちます。ぜひ活用してみてください。
-
MySQLのCASE WHENステートメントで条件別のカウントを実行する方法
条件に応じてレコードをカウントしたい場合には、CASE WHENステートメントを活用すると便利です。この記事では、サンプルテーブルを作成し、SUM関数と組み合わせて条件別の件数を集計する手順を、実行結果つきでわかりやすく解説します。 1. サンプルテーブルの作成 まず、以下のコマンドでテーブルを作成しましょう。 mysql> create table DemoTable1910 ( FirstName varchar(20), Marks int ); Query OK, 0 rows affected (0.00 sec) 2. レコードの挿入 続い
-
MySQLで数字を含む文字列を自然な順序で並べ替える方法
MySQLで数字を含む文字列を自然な順序で並べ替える方法MySQLで「2J John has 9」や「2J John has 58」のように数字が混ざった文字列を並べ替えたい場合、単純なORDER BYでは文字列単位で比較されるため、意図したとおりの順序にならないことがあります。このようなときは、REGEXP_REPLACE関数やLENGTH関数をORDER BY句と組み合わせることで、人間にとって自然な順序(自然順ソート)を実現できます。ここでは、実際にテーブルを作成して手順を確認していきましょう。1. サンプルテーブルの作成まず、CREATE TABLE文でテーブルを作成します。mysql