MySQLでカラムに使用する変数名を展開したい場合の記述方法

スポンサーリンク

タイトルだと少しわかりづらいですが、

例えば、「sample1」「sample2」「sample3」というような連番のカラムであった場合などは、カラム名部分を変数にし、「sample」という文字とインクリメントする値を結合したものを代入すると思います。

ただ、そのまま処理を書いた場合は、変数が展開されず、正しい値が取得できません。

例えばこうです。

mysql> set @test =concat('sample','1');
Query OK, 0 rows affected (0.00 sec)

mysql> select @test from tablename;
+---------+
| @test   |
+---------+
| sample1 |
| sample1 |
| sample1 |
+---------+

3 rows in set (0.00 sec)

値の取得に失敗しています。

MySQLは、存在しないカラム名であってもテーブルが存在すればエラーは吐かず、そのカラム名(存在しないカラム名)でマスキングした状態で値を返します。

解決法

ソースコードで例を示した方がわかりやすいかと思います。

mysql> set @test =concat('sample','1');
Query OK, 0 rows affected (0.00 sec)
mysql> set @query = concat('select ',@test ,' from tablename');
Query OK, 0 rows affected (0.00 sec)
mysql> prepare stmt from @query;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute stmt;

+---------+
| sample1 |
+---------+
| test001 |
| test002 |
| test003 |
+---------+

定義した変数を使用し、クエリを変数として定義しています。

その後の動作は、定型文として考えてよいでしょう。

スポンサーリンク

IT, MySQL

Posted by took