如何用SQL将多列表转换为Person、Column、Value行式结构?
实现SQL列转行(Unpivot)需求
你的需求是将宽表转换为长表,也就是**列转行(Unpivot)**操作,以下是几种主流数据库的实现方式:
通用兼容方案(所有SQL数据库可用)
使用UNION ALL拼接每个非Person列的结果,这是最通用的写法,适配所有数据库:
SELECT Person, 'Hobbies' AS Column, Hobbies AS Value FROM your_table_name UNION ALL SELECT Person, 'School' AS Column, School AS Value FROM your_table_name UNION ALL SELECT Person, 'Jobs' AS Column, Jobs AS Value FROM your_table_name ORDER BY Person, Column;
数据库专用语法方案
SQL Server / Azure SQL / Oracle
这类数据库支持原生UNPIVOT语法,代码更简洁:
SELECT Person, Column, Value FROM your_table_name UNPIVOT ( Value FOR Column IN (Hobbies, School, Jobs) ) AS unpivoted_data ORDER BY Person, Column;
PostgreSQL
可借助jsonb函数实现,适合列名不确定的场景:
SELECT t.Person, kv.jsonb_keys AS Column, kv.jsonb_values AS Value FROM your_table_name t, LATERAL jsonb_each_text(to_jsonb(t) - 'Person') AS kv(jsonb_keys, jsonb_values) ORDER BY Person, Column;
MySQL 8.0+
利用JSON_TABLE函数实现:
SELECT t.Person, jt.Column, jt.Value FROM your_table_name t, JSON_TABLE( JSON_OBJECT('Hobbies', Hobbies, 'School', School, 'Jobs', Jobs), '$.*' COLUMNS ( Column VARCHAR(50) PATH '$[key]', Value VARCHAR(50) PATH '$[value]' ) ) jt ORDER BY Person, Column;
注意事项
- 替换代码中的
your_table_name为实际表名 - 如果
Value列需存储不同数据类型,可通过CAST函数统一转换为字符串类型 - 可根据需求调整
ORDER BY子句控制结果排序
内容的提问来源于stack exchange,提问作者userav
相关产品推荐
相关产品推荐

