You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 18:30:03