如何将SQL单行查询结果转换为列名与对应值分行展示的格式?
实现方案
你只需将原查询封装为仅执行一次的临时结果集(CTE/派生表),再做逆透视转换即可,不需要重复执行原查询,也不会额外增加耗时。
通用写法(兼容绝大多数主流数据库)
使用VALUES行构造实现列转行,无需依赖数据库独有的UNPIVOT语法:
WITH original_single_row AS ( -- 此处替换为你自己的原查询语句,全局仅执行一次 SELECT Col1, Col2, Col3, Col4 FROM <your_original_query_condition> ) SELECT CONCAT(col_name, ' | ', col_value) AS result FROM original_single_row CROSS JOIN ( VALUES ('Col1', Col1), ('Col2', Col2), ('Col3', Col3), ('Col4', Col4) ) AS unpivoted_result(col_name, col_value);
支持UNPIVOT语法的数据库(Oracle/SQL Server/PostgreSQL 10+)
可以用原生逆透视函数,语法更简洁:
WITH original_single_row AS ( -- 替换为你的原查询,仅执行一次 SELECT Col1, Col2, Col3, Col4 FROM <your_original_query_condition> ) SELECT CONCAT(col_name, ' | ', col_value) AS result FROM original_single_row UNPIVOT ( col_value FOR col_name IN (Col1, Col2, Col3, Col4) ) AS unpivoted_data;
MySQL 8.0以下兼容写法
如果你的数据库不支持CTE和VALUES行构造,可用如下写法,注意这里的UNION ALL是对内存中已查询到的单行结果做拆分,原查询仅执行一次,不会有性能损耗:
SELECT CONCAT('Col1 | ', Col1) AS result FROM ( -- 原查询仅在内层执行一次 SELECT Col1, Col2, Col3, Col4 FROM <your_original_query_condition> ) t UNION ALL SELECT CONCAT('Col2 | ', Col2) AS result FROM t UNION ALL SELECT CONCAT('Col3 | ', Col3) AS result FROM t UNION ALL SELECT CONCAT('Col4 | ', Col4) AS result FROM t
内容的提问来源于stack exchange,提问作者Sayyam
相关产品推荐
相关产品推荐

