You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:21:03