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

如何编写Oracle查询将属性-值行转换为结构化产品表?

Oracle将Attribute-Value格式表转换为结构化表的解决方案

问题场景

假设存在如下Attribute-Value格式的表(表名记为attr_value_table):

Attribute       Value
product_id      P1
product_name    AAA
product_id      P2
product_name    BBB
product_id      P3
product_name    CCC

需要将其转换为结构化的二维表:

product_id  product_name
P1          AAA
P2          BBB
P3          CCC

已知属性顺序固定,product_id后必然紧跟对应的product_name,尝试使用PIVOT时因需要聚合函数无法满足需求,需其他可行方案。

可行解决方案

方案1:基于行号分组聚合

通过给每行生成行号,将成对的product_id和product_name划分为同一分组,再通过条件聚合提取对应字段:

SELECT
    MAX(CASE WHEN Attribute = 'product_id' THEN Value END) AS product_id,
    MAX(CASE WHEN Attribute = 'product_name' THEN Value END) AS product_name
FROM (
    SELECT
        Attribute,
        Value,
        -- 每2行分为一个组,匹配成对的属性
        CEIL(ROW_NUMBER() OVER (ORDER BY NULL) / 2) AS group_id
    FROM attr_value_table
) grouped_data
GROUP BY group_id
ORDER BY group_id;

提示:ORDER BY NULL需替换为表中实际的排序字段(如时间戳、原始XML的节点顺序字段等),确保分组逻辑的准确性。

方案2:使用LEAD函数直接关联后续行

利用属性顺序固定的特性,用LEAD函数获取product_id行的下一行值作为对应的product_name,再筛选出product_id的行即可:

SELECT
    Value AS product_id,
    LEAD(Value) OVER (ORDER BY NULL) AS product_name
FROM attr_value_table
WHERE Attribute = 'product_id'
ORDER BY product_id;

提示:同样需将ORDER BY NULL替换为实际排序字段,保证LEAD能精准获取对应的product_name值。

内容的提问来源于stack exchange,提问作者Matthew Huang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:12:06