Oracle SQLPLUS如何将查询结果转置为逐行显示?
Oracle SQLPlus 实现查询结果转置(字段名+值逐行显示)
SQLPlus本身没有内置的一键转置命令,但可以通过以下两种SQL方式实现你需要的「字段名+对应值逐行显示」效果,适配Putty终端的输出需求:
方法1:使用UNPIVOT(Oracle 11g及以上版本)
这是最简洁的原生SQL转置方式,适合单条或多条记录的转置:
-- 示例:转置EMP表中员工编号7369的信息 SELECT column_name, column_value FROM ( -- 这里写你的原始查询语句 SELECT empno, ename, job, sal, hiredate FROM emp WHERE empno = 7369 ) UNPIVOT ( -- 定义值列和字段名列 column_value FOR column_name IN ( empno AS 'EMPNO', ename AS 'ENAME', job AS 'JOB', sal AS 'SALARY', hiredate AS 'HIRE DATE' ) );
方法2:使用UNION ALL(兼容所有Oracle版本)
如果你的Oracle版本低于11g,可通过手动拼接查询实现转置,注意统一字段类型(非字符类型需转成字符串):
-- 示例:转置EMP表中员工编号7369的信息 SELECT 'EMPNO' AS column_name, TO_CHAR(empno) AS column_value FROM emp WHERE empno=7369 UNION ALL SELECT 'ENAME' AS column_name, ename AS column_value FROM emp WHERE empno=7369 UNION ALL SELECT 'JOB' AS column_name, job AS column_value FROM emp WHERE empno=7369 UNION ALL SELECT 'SALARY' AS column_name, TO_CHAR(sal) AS column_value FROM emp WHERE empno=7369 UNION ALL SELECT 'HIRE DATE' AS column_name, TO_CHAR(hiredate, 'DD-MON-YYYY') AS column_value FROM emp WHERE empno=7369;
优化SQLPlus终端输出效果
配合以下SQLPlus设置,让转置后的结果更整齐,避免混乱:
SET PAGESIZE 0 -- 隐藏表头、分页符 SET FEEDBACK OFF -- 隐藏查询记录数提示 SET TRIMSPOOL ON -- 去除输出末尾的空格 SET LINESIZE 60 -- 根据终端宽度调整,避免折行 SET HEADING OFF -- 隐藏列标题 -- 执行你的转置查询 -- ... -- 恢复默认设置(可选) SET PAGESIZE 14 SET FEEDBACK ON SET HEADING ON
补充说明
你可能混淆了其他数据库工具(如PL/SQL Developer)的一键转置功能,SQLPlus本身确实没有直接的转置命令,上述SQL方法是终端环境下的最优解决方案。
内容的提问来源于stack exchange,提问作者Martyn
相关产品推荐
相关产品推荐

