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

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文を組み合わせたテクニックが非常に役立ちます。ぜひ活用してみてください。

  1. 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. レコードの挿入 続い

  2. MySQLで数字を含む文字列を自然な順序で並べ替える方法

    MySQLで数字を含む文字列を自然な順序で並べ替える方法MySQLで「2J John has 9」や「2J John has 58」のように数字が混ざった文字列を並べ替えたい場合、単純なORDER BYでは文字列単位で比較されるため、意図したとおりの順序にならないことがあります。このようなときは、REGEXP_REPLACE関数やLENGTH関数をORDER BY句と組み合わせることで、人間にとって自然な順序(自然順ソート)を実現できます。ここでは、実際にテーブルを作成して手順を確認していきましょう。1. サンプルテーブルの作成まず、CREATE TABLE文でテーブルを作成します。mysql