名前で列を選択したいと思います。名前はTABLE_MASTERの文字列です。
SQLは文字列式を使用して列を選択できないため、単一のSQLクエリでこれを行うことはできません。文字列と識別子には違いがあります。たとえば、これは識別子によって列からデータを選択します:
SELECT header01 ...
ただし、以下は文字列式です(単純な式であり、単なる定数値です)。その名前の列からのデータではなく、固定文字列'header01'のみを返します:
SELECT 'header01' ...
同様に、選択リストで他の式を使用すると、その式の値のみが選択され、式の文字列値で指定された列に格納されているデータは選択されません。
したがって、他の変数または式で指定された動的列をクエリで返す場合は、その式を読み取る同じクエリでそれを行うことはできません。読み取った値から新しいSQLクエリをフォーマットする必要があります。これは動的SQLステートメントと呼ばれます (私が自分の答えを書いている間に答えを投稿したspencer7593によってすでに言及されています。)
TABLE_MASTERを使用して、動的SQLステートメントをフォーマットし、列をフェッチしてそのエイリアスを再定義できます。
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
この結果、別のSELECTステートメントを形成する文字列が作成されます。これにより、必要に応じて列の名前が変更されます。
SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE
次に、@sql
に保存されている文字列を使用できます 動的SQLクエリとして。
これを行う手順は次のとおりです。
DELIMITER ;;
CREATE PROCEDURE MyProc()
BEGIN
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ',
QUOTE(MAX(NAME)), ' AS NAME ',
'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
DELIMITER ;
プロシージャを呼び出して、結果を取得します:
CALL MyProc();
+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01 | data02 | Paul |
| data11 | data12 | Paul |
+-----------------+-----------------+------+
これは大変なことだとコメントしなければなりません。データベースにあるデータをそのままフェッチし、アプリケーションコードで再フォーマットしたいのですが、動的SQLを使用して列をフォーマットする必要はありません。