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

如何在Presto中将订单商品数组拆分为item与价格对应多列

解决方案

场景1:已知订单最大商品数,可接受固定列数

这种情况直接用数组下标取值即可,Presto中数组下标从1开始,超出数组长度的取值会返回NULL,刚好符合你要的效果。
示例查询代码:

SELECT
    `order`,
    item[1].item_id AS item1,
    item[2].item_id AS item2,
    item[3].item_id AS item3,
    -- 最大商品数有多少就追加写到对应itemN即可
    item[1].item_price AS price1,
    item[2].item_price AS price2,
    item[3].item_price AS price3
    -- 同理追加写到对应priceN即可
FROM 你的表名

你提供的示例数据执行上述查询,就能得到你贴的示例输出结果。

场景2:商品数量无上限,需要动态列

Presto原生SQL不支持动态列输出,因为SQL执行前必须确定返回的列数和列类型,无法随数据内容动态调整列数,这种情况可以用以下两种替代方案:

方案A:输出为Map/JSON格式

把所有item和price的键值对存在一个Map列里,不管多少个商品都可以完整存储,查询时可以直接按键取值。
示例查询代码:

WITH order_items AS (
    SELECT
        `order`,
        pos,
        item_info.item_id,
        item_info.item_price
    FROM 你的表名
    CROSS JOIN UNNEST(item) WITH ORDINALITY AS t(item_info, pos)
)
SELECT
    `order`,
    map_agg(
        CASE WHEN type = 'item' THEN 'item' || pos ELSE 'price' || pos END,
        value
    ) AS item_price_map
FROM order_items
CROSS JOIN (VALUES ('item', item_id), ('price', item_price)) AS t(type, value)
GROUP BY `order`

输出的item_price_map列结构为{"item1":11,"price1":1000,"item2":22,"price2":3000...},可以直接按key读取对应值。

方案B:上层工具处理

如果必须要多列展示,可以先查询出每个订单的原始item数组,在业务代码、BI工具中做动态列展开,市面上多数BI工具(比如Metabase、Superset)都支持数组类型自动展开为多列的功能。

内容的提问来源于stack exchange,提问作者Ánh Lâm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:06:00