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

如何在Redshift中使用PartiQL查询含嵌套对象数组的JSON数据?

问题描述

现有JSON数据如下:

{
  "id": 1,
  "sets": [
    {
      "values": [
        {
          "value": 1
        },
        {
          "value": 2
        }
      ]
    },
    {
      "values": [
        {
          "value": 5
        },
        {
          "value": 6
        }
      ]
    }
  ]
}

对应Redshift表名为X,尝试执行以下PartiQL查询:

SELECT x.id, v.value 
FROM X as x,
  x.sets as sets,
  sets.values as v

期望得到结果(注:原期望结果中id为2属于笔误,正确结果id应为1):

id, value
1, 1
1, 2
1, 5
1, 6

但当sets和values包含多个对象时,查询报错:column 'id' had 0 remaining values but expected 2,需要明确Redshift中查询此类嵌套数组结构的正确PartiQL写法。

正确解决方案

在Redshift中处理多层嵌套数组时,必须通过UNNEST显式展开每一层数组,才能保证外层标量字段与内层数组元素正确关联。以下是两种可行的写法:

写法一:使用CROSS JOIN UNNEST

SELECT x.id, v.value
FROM X x
CROSS JOIN UNNEST(x.sets) AS sets
CROSS JOIN UNNEST(sets.values) AS v;

写法二:使用隐式JOIN的UNNEST语法

SELECT x.id, v.value
FROM X x,
     UNNEST(x.sets) AS sets,
     UNNEST(sets.values) AS v;

错误原因

原查询的语法仅适用于单层数组或每层数组只有一个元素的场景。当存在多层多元素数组时,Redshift无法自动匹配外层标量字段(如id)与内层数组的多个元素,导致元素数量不匹配的报错。通过UNNEST逐层展开数组,能生成正确的笛卡尔积结果,确保每个数组元素都能关联到外层的id字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:25:20