如何在Oracle中将列状数据转换为行状展示(表1转表2)
Oracle 列转行(行转列)实现方案
针对将表1的列状(多行键值对)数据转换为表2的行状(单行多字段)展示的需求,提供以下几种实现方式:
方法1:使用PIVOT函数(Oracle 11g+)
PIVOT是Oracle 11g及以上版本支持的内置行转列函数,语法简洁高效。假设表1结构为table1(id, key_name, key_value),目标列包含姓名、年龄、性别,示例SQL如下:
SELECT * FROM table1 PIVOT ( -- 聚合函数:因每个id+key_name唯一,MAX/MIN不影响结果 MAX(key_value) -- 指定要转成列的字段 FOR key_name IN ( '姓名' AS 姓名, '年龄' AS 年龄, '性别' AS 性别 ) ) ORDER BY id;
方法2:CASE WHEN + GROUP BY(兼容低版本)
如果使用Oracle 10g及以下版本,可通过CASE WHEN匹配字段值,结合GROUP BY合并行:
SELECT id, MAX(CASE WHEN key_name = '姓名' THEN key_value END) AS 姓名, MAX(CASE WHEN key_name = '年龄' THEN key_value END) AS 年龄, MAX(CASE WHEN key_name = '性别' THEN key_value END) AS 性别 FROM table1 GROUP BY id ORDER BY id;
方法3:动态SQL(处理不固定的key值)
若表1中key_name的取值不固定,无法提前枚举,可通过动态SQL自动生成目标列:
DECLARE v_sql VARCHAR2(4000); v_cols VARCHAR2(4000); BEGIN -- 提取所有唯一的key_name,生成列定义语句 SELECT LISTAGG('''' || key_name || ''' AS ' || key_name, ', ') WITHIN GROUP (ORDER BY key_name) INTO v_cols FROM (SELECT DISTINCT key_name FROM table1); -- 拼接完整的PIVOT查询语句 v_sql := 'SELECT * FROM table1 PIVOT (MAX(key_value) FOR key_name IN (' || v_cols || ')) ORDER BY id'; -- 执行动态SQL EXECUTE IMMEDIATE v_sql; END; /
内容的提问来源于stack exchange,提问作者xajid
相关产品推荐
相关产品推荐

