ユーザー定義変数を使用してテーブル名の代わりをしようとしているので、mysql だけを使用でき、他の言語は必要ありません。
この例は非常に単純化されています。実際のスクリプトはテーブル名を大量に使用しており、エンド ユーザーは検索/置換ではなく、変数を変更するだけの方が簡単です。
SET @tablename = 'mytable';
SELECT * FROM @tablename;
これは機能しませんが、必要な最終結果が表示されます。
ユーザー定義変数を使用してテーブル名の代わりをしようとしているので、mysql だけを使用でき、他の言語は必要ありません。
この例は非常に単純化されています。実際のスクリプトはテーブル名を大量に使用しており、エンド ユーザーは検索/置換ではなく、変数を変更するだけの方が簡単です。
SET @tablename = 'mytable';
SELECT * FROM @tablename;
これは機能しませんが、必要な最終結果が表示されます。
準備済みステートメントを使用します。
SET @tablename = 'mytable';
SET @query = CONCAT('SELECT * FROM ', @mytable);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
実際のクエリがはるかに複雑な場合は、クエリの構築をストアド関数でラップできます。
DELIMITER //
CREATE FUNCTION GetQuery(tableName VARCHAR(50)) RETURNS VARCHAR(100)
BEGIN
DECLARE finalQuery VARCHAR(100);
SET finalQuery = CONCAT('SELECT * FROM ', tableName);
-- do something fancier with finalQuery here
RETURN finalQuery;
END //
DELIMITER ;
SET @query = GetQuery('mytable');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
さらに良いこと: ストアド プロシージャですべてを実行します。
DELIMITER //
CREATE PROCEDURE QueryTable(tableName VARCHAR(50))
BEGIN
SET @finalQuery = CONCAT('SELECT * FROM ', tableName);
PREPARE stmt FROM @finalQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @finalQuery = NULL;
END //
DELIMITER ;
CALL QueryTable('mytable');