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

Snowflake数据库中如何将JSON解析表的列表字段拆分为多行

Snowflake 拆分数组字段为独立行实现方案

前置说明

假设你的原始表名为 json_parsed_table,包含非数组的基础字段(比如id、创建时间等)、数组类型字段CITY、数组类型字段ORDERS。如果你的两个数组字段实际是JSON字符串格式而非Snowflake原生ARRAY类型,后面方案中需要先调用PARSE_JSON()做类型转换。


方案1:两个数组元素一一对应拆分(保留位置匹配关系)

如果业务逻辑中CITY数组的第N个元素和ORDERS数组的第N个元素是对应关系,可通过WITH OFFSET匹配索引实现:

SELECT
  t.* exclude (CITY, ORDERS), -- 保留原始表除两个数组字段外的所有字段
  c.value::STRING AS city,
  o.value::STRING AS orders -- 根据实际字段类型调整强制转换的目标类型
FROM json_parsed_table t,
LATERAL FLATTEN(input => t.CITY) WITH OFFSET AS c_idx,
LATERAL FLATTEN(input => t.ORDERS) WITH OFFSET AS o_idx
WHERE c_idx = o_idx;

如果两个数组长度不一致,可改用FULL OUTER JOIN的方式避免丢失数据:

SELECT
  t.* exclude (CITY, ORDERS),
  c.value::STRING AS city,
  o.value::STRING AS orders
FROM json_parsed_table t
LEFT JOIN LATERAL FLATTEN(input => t.CITY) WITH OFFSET AS c_idx ON TRUE
FULL OUTER JOIN LATERAL FLATTEN(input => t.ORDERS) WITH OFFSET AS o_idx ON c_idx = o_idx;

方案2:两个数组全组合拆分(笛卡尔积)

如果业务需要所有城市和所有订单的排列组合结果,直接嵌套LATERAL FLATTEN即可:

SELECT
  t.* exclude (CITY, ORDERS),
  c.value::STRING AS city,
  o.value::STRING AS orders
FROM json_parsed_table t,
LATERAL FLATTEN(input => t.CITY) c,
LATERAL FLATTEN(input => t.ORDERS) o;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:06:07