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

如何修改SQL查询语句,将BookInfo表数据转为不含BookID的纵向格式?

实现横向数据转不含BookID的纵向格式

要把横向的BookInfo表数据转为不含BookID的纵向格式,核心是把每个非BookID字段的名称和对应值拆成单独行。不同数据库的实现方式略有差异,以下是主流数据库的可行方案:

通用方案:UNION ALL(适配所有SQL数据库)

这是最普适的方法,原理是把每个字段的查询结果逐一合并。假设你的BookInfo表除BookID外,还有BookName(书名)、Author(作者)、PublishYear(出版年份)、Price(价格)字段,SQL语句如下:

SELECT '书名' AS 字段名称, BookName AS 字段值 FROM BookInfo
UNION ALL
SELECT '作者' AS 字段名称, Author AS 字段值 FROM BookInfo
UNION ALL
SELECT '出版年份' AS 字段名称, CAST(PublishYear AS VARCHAR) AS 字段值 FROM BookInfo
UNION ALL
SELECT '价格' AS 字段名称, CAST(Price AS VARCHAR) AS 字段值 FROM BookInfo;
  • 注意:数字、日期类型的字段要通过CAST/CONVERT转成字符串,保证所有合并结果的列类型一致。
  • 你可以根据自己表的实际字段,替换字段名称的描述和对应的字段名。

简洁方案:UNPIVOT(适用于SQL Server、Oracle等)

如果你的数据库支持UNPIVOT语法,能更高效实现需求:

SELECT 字段名称, 字段值
FROM (
    -- 先把非字符串类型字段转成字符串,并重命名为易读的字段名
    SELECT 
        BookName AS 书名, 
        Author AS 作者, 
        CAST(PublishYear AS VARCHAR) AS 出版年份, 
        CAST(Price AS VARCHAR) AS 价格
    FROM BookInfo
) AS SourceTable
UNPIVOT (
    字段值 FOR 字段名称 IN (书名, 作者, 出版年份, 价格)
) AS UnpivotTable;

进阶方案:JSON函数(适用于MySQL 8.0+、PostgreSQL等)

MySQL 8.0+

借助JSON函数把行转成JSON对象,再拆分出键值对行:

SELECT 
    JSON_UNQUOTE(JSON_EXTRACT(json_row, CONCAT('$."', col_name, '"'))) AS 字段名称,
    JSON_UNQUOTE(JSON_EXTRACT(json_row, CONCAT('$.', col_name))) AS 字段值
FROM (
    -- 把需要的字段打包成JSON对象
    SELECT JSON_OBJECT('书名', BookName, '作者', Author, '出版年份', PublishYear, '价格', Price) AS json_row
    FROM BookInfo
) t,
-- 提取JSON对象的所有键
JSON_TABLE(
    JSON_KEYS(json_row),
    '$[*]' COLUMNS(col_name VARCHAR(50) PATH '$')
) j;

PostgreSQL

利用jsonb_each_text函数直接拆分行数据:

SELECT 
    key AS 字段名称,
    value AS 字段值
FROM BookInfo,
-- 把整行转成JSONB并移除BookID字段,再拆分键值对
jsonb_each_text(to_jsonb(BookInfo) - 'BookID');

内容的提问来源于stack exchange,提问作者Juan Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:23:21