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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:55:22