MySQL如何将单行查询结果转键值对行且无需硬编码列名?
MySQL单行查询结果转键值对(无需硬编码列名)实现方案
方案1:MySQL 8.0.19+ 版本原生支持(推荐)
利用JSON_OBJECT(*)语法直接将整行数据转为JSON对象,再通过JSON_TABLE拆解为键值对行,无需手动罗列所有列名:
SELECT j.KeyHeader, j.ValueHeader FROM wp_users u CROSS JOIN JSON_TABLE( JSON_OBJECT(*), '$.keyvalue()' COLUMNS ( KeyHeader VARCHAR(64) PATH '$.key', ValueHeader VARCHAR(255) PATH '$.value' ) ) j WHERE u.ID = 28;
说明:如果遇到类型不兼容问题,可以将ValueHeader的返回类型调整为JSON,或者用CAST函数统一转为字符串类型。
方案2:全版本兼容动态SQL方案
通过查询元数据表自动生成转换语句,适配所有MySQL版本,完全不需要提前知道列名:
-- 1. 生成动态转换SQL SET @target_id = 28; SET @convert_sql = NULL; SELECT GROUP_CONCAT( 'SELECT ''', COLUMN_NAME, ''' AS KeyHeader, CAST(`', COLUMN_NAME, '` AS CHAR) AS ValueHeader FROM wp_users WHERE ID = ', @target_id SEPARATOR ' UNION ALL ' ) INTO @convert_sql FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wp_users'; -- 2. 执行生成的SQL PREPARE run_stmt FROM @convert_sql; EXECUTE run_stmt; DEALLOCATE PREPARE run_stmt;
常见场景适配
如果需要将转换结果和其他查询结果合并,直接拼接原有SQL即可:
SET @final_sql = CONCAT('/* 你的原有查询语句 */ UNION ALL ', @convert_sql); PREPARE run_final FROM @final_sql; EXECUTE run_final; DEALLOCATE PREPARE run_final;
内容的提问来源于stack exchange,提问作者Matheus Mansour
相关产品推荐
相关产品推荐

