如何编写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
相关产品推荐
相关产品推荐

