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

如何在Snowflake中展平含多数组的JSON并提取关联数据?

解决Snowflake中JSON多数组按索引对应展平的问题

问题核心是三个数组(ItemCountGroup、ItemDescGroup、ItemTypeGroup)是按索引一一对应的,直接分别FLATTEN会产生笛卡尔积(所有元素无差别组合),正确做法是利用FLATTEN返回的索引关联对应位置的元素。

假设你的表结构:

  • 表名:order_json
  • 存储JSON的VARIANT字段:json_data

实现SQL:

SELECT
    json_data:ordernumber::STRING AS order_number,
    -- 从ItemCountGroup取当前索引的元素
    flattened_item_count.value::INT AS item_count,
    -- 通过索引取ItemDescGroup对应位置的元素
    json_data:ItemDescGroup[flattened_item_count.index]::STRING AS item_desc,
    -- 通过索引取ItemTypeGroup对应位置的元素
    json_data:ItemTypeGroup[flattened_item_count.index]::STRING AS item_type
FROM
    order_json,
    LATERAL FLATTEN(input => json_data:ItemCountGroup) AS flattened_item_count
-- 可选:过滤三个数组长度不一致的异常数据
WHERE
    ARRAY_SIZE(json_data:ItemCountGroup) = ARRAY_SIZE(json_data:ItemDescGroup)
    AND ARRAY_SIZE(json_data:ItemCountGroup) = ARRAY_SIZE(json_data:ItemTypeGroup);

关键说明:

  • LATERAL FLATTEN展开ItemCountGroup时,会返回每个元素的value和对应的index(元素在数组中的位置,从0开始计数)。
  • 利用index访问另外两个数组的对应位置元素,保证三个字段属于同一组关联数据,避免笛卡尔积。
  • 可选的WHERE条件用于排除数组长度不匹配的异常JSON,防止出现NULL或错位数据。

将结果存入单独表:

基于上述查询创建目标表:

CREATE TABLE order_items AS
SELECT
    json_data:ordernumber::STRING AS order_number,
    flattened_item_count.value::INT AS item_count,
    json_data:ItemDescGroup[flattened_item_count.index]::STRING AS item_desc,
    json_data:ItemTypeGroup[flattened_item_count.index]::STRING AS item_type
FROM
    order_json,
    LATERAL FLATTEN(input => json_data:ItemCountGroup) AS flattened_item_count
WHERE
    ARRAY_SIZE(json_data:ItemCountGroup) = ARRAY_SIZE(json_data:ItemDescGroup)
    AND ARRAY_SIZE(json_data:ItemCountGroup) = ARRAY_SIZE(json_data:ItemTypeGroup);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:35:16