如何使用Pivot/Unpivot将SQL结果集列名转换为独立的Name/Value列
可行解决方案
该需求属于标准的列转行场景,有两种常用的实现方式,可根据你使用的数据库选型:
方法1:原生UNPIVOT语法(适配Oracle、SQL Server、PostgreSQL 12+等支持UNPIVOT的数据库)
无需手动硬编码列名映射,语法自带提取原列名作为行值的能力,示例代码如下(假设你的原结果集来自表user_info):
SELECT Name, Value FROM user_info UNPIVOT ( Value FOR Name IN (Username, Birthday, Gender) ) AS unpivot_result;
执行后输出结果完全匹配你的要求:Name列自动填充IN子句中声明的原列名,Value列填充对应列的取值。
方法2:UNION ALL通用实现(适配所有数据库,包括MySQL、SQLite等不支持UNPIVOT的数据库)
如果所用数据库没有内置UNPIVOT能力,可以用UNION ALL手动拼接查询,兼容性更强:
SELECT 'Username' AS Name, Username AS Value FROM user_info UNION ALL SELECT 'Birthday' AS Name, Birthday AS Value FROM user_info UNION ALL SELECT 'Gender' AS Name, Gender AS Value FROM user_info;
如果原表有多条数据,两种方案都会自动为每条原数据生成对应的3行转置结果。如果需要仅转置特定行,可以在子查询中先加过滤条件再执行转置操作,示例:
-- 仅转置Username为Tom的单条数据 SELECT Name, Value FROM ( SELECT * FROM user_info WHERE Username = 'Tom' ) AS filter_result UNPIVOT ( Value FOR Name IN (Username, Birthday, Gender) ) AS unpivot_result;
内容的提问来源于stack exchange,提问作者Chen
相关产品推荐
相关产品推荐

