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

mysqlは、動的な行の値を列名として選択し、別の列を値として選択します

    他のいくつかのRDBMSとは異なり、MySQLは、この種のピボット操作を設計によりネイティブにサポートしていません。 (開発者は、アプリケーションのデータベース層よりもプレゼンテーション層に適していると感じています。)

    MySQL内でそのような操作を絶対に実行する必要がある場合は、CASEをいじくり回すのではなく、プリペアドステートメントを作成するのが最善の方法です。 、おそらくMySQLのGROUP_CONCAT() 機能:

    SELECT CONCAT(
      'SELECT `table`.id', GROUP_CONCAT('
         ,    `t_', REPLACE(name, '`', '``'), '`.value
             AS `', REPLACE(name, '`', '``'), '`'
         SEPARATOR ''),
     ' FROM `table` ', GROUP_CONCAT('
         LEFT JOIN `table`   AS `t_', REPLACE(name, '`', '``'), '`
                ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id
               AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name)
         SEPARATOR ''),
     ' GROUP BY `table`.id'
    ) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t;
    
    PREPARE stmt FROM @qry;
    EXECUTE stmt;
    

    sqlfiddle でご覧ください 。

    GROUP_CONCAT() group_concat_max_lenによって制限されます 変数(デフォルトは1024バイト:非常に長いnameがない限り、ここでは関係ありません。 値)。




    1. OCTET_LENGTH()関数がMySQLでどのように機能するか

    2. CMONHAを使用したClusterControlノードの高可用性構成

    3. PostgreSQLVACUUMおよびANALYZEのベストプラクティスのヒント

    4. Rでパスワードを暗号化-RODBCを使用してOracleDBに接続します