如何修改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
相关产品推荐
相关产品推荐

