sql >> データベース >  >> RDS >> Mysql

別のテーブルで定義されたマッピングに従ってテーブルの列の名前を変更する-MYSQLを使用

    名前で列を選択したいと思います。名前は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を使用して列をフォーマットする必要はありません。



    1. SQL Developerでローカルファイルを読み取るにはどうすればよいですか?

    2. 引数2の無効なJSONテキスト-MySQL5.7.8のjson_contains

    3. テーブルIDをシリアルからIDに変更するにはどうすればよいですか?

    4. SQLServerのローカルおよびグローバル一時テーブル