Oracle SQL如何实现单列值拆分转换为多个列
实现方案
前提假设
根据你提供的原始数据和输出格式示意,假设你的原始表为src_data,包含3个核心字段:
main_id:同一组数据的唯一标识(比如示例里的序号/ID)attr_name:属性名称(比如示例里的姓名、年龄、性别等字段名)attr_value:属性对应的取值
方案1:Oracle 11g及以上版本,使用PIVOT行转列函数(属性固定时推荐)
如果你的属性名称是固定的,直接用以下SQL:
SELECT * FROM src_data PIVOT ( MAX(attr_value) -- 同一main_id+attr_name唯一时,用MAX/MIN都可 FOR attr_name IN ( '姓名' AS 姓名, '年龄' AS 年龄, '性别' AS 性别, '住址' AS 住址 ) ) ORDER BY main_id;
方案2:兼容所有Oracle版本,使用CASE WHEN+聚合函数实现
如果你的Oracle版本低于11g,或者需要更灵活的自定义逻辑,可以用以下写法:
SELECT main_id, MAX(CASE WHEN attr_name = '姓名' THEN attr_value END) AS 姓名, MAX(CASE WHEN attr_name = '年龄' THEN attr_value END) AS 年龄, MAX(CASE WHEN attr_name = '性别' THEN attr_value END) AS 性别, MAX(CASE WHEN attr_name = '住址' THEN attr_value END) AS 住址 FROM src_data GROUP BY main_id ORDER BY main_id;
方案3:属性不固定时的动态SQL实现
如果属性名称不固定、会动态新增,可以用存储过程拼接动态SQL实现,示例代码如下:
DECLARE v_sql VARCHAR2(4000); v_cols VARCHAR2(2000); BEGIN -- 拼接所有去重后的属性名 SELECT LISTAGG(''''||attr_name||''' AS '||attr_name, ',') WITHIN GROUP (ORDER BY attr_name) INTO v_cols FROM (SELECT DISTINCT attr_name FROM src_data); -- 拼接最终执行SQL v_sql := 'SELECT * FROM src_data PIVOT (MAX(attr_value) FOR attr_name IN ('||v_cols||')) ORDER BY main_id'; -- 执行SQL,可根据需求输出结果或插入到目标表 DBMS_OUTPUT.PUT_LINE(v_sql); EXECUTE IMMEDIATE v_sql; END; /
内容的提问来源于stack exchange,提问作者user2862073
相关产品推荐
相关产品推荐

