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

使用NestJS+BigQuery更新嵌套数组字段时遇语法错误求助

解决BigQuery嵌套重复数组字段更新语法问题

错误原因分析

你之前的SQL语句存在两个核心问题:

  1. 语法格式错误:UPDATE的SET子句必须遵循列名=表达式的格式,你直接写JSON_SET(...)未指定对应列名,触发语法报错。
  2. 类型不匹配:descriptions是REPEATED RECORD(重复结构体)类型,而非JSON类型,不能用JSON_ARRAY传入JSON字符串赋值,必须使用BigQuery原生的结构体和数组构造语法。

正确更新方式

方式1:替换整个descriptions数组

如果需要完全替换数组内容,直接构造符合表结构的结构体数组即可:

UPDATE
  myDataset.myTable
SET
  name = 'TEST',
  type = 'LANG',
  descriptions = [
    STRUCT(STRUCT('es' AS language, 'test-es' AS text) AS description),
    STRUCT(STRUCT('jp' AS language, 'test-jp' AS text) AS description)
  ]
WHERE
  id = '1'

这里通过STRUCT()函数逐层构造嵌套结构:

  • 内层STRUCT('es' AS language, ...)对应description字段的子结构体
  • 外层STRUCT(...) AS description对应descriptions数组的每个元素

方式2:更新数组中指定位置的元素

如果不需要替换整个数组,仅更新某几个索引的元素,可以结合UNNEST和ARRAY_AGG实现:

UPDATE
  myDataset.myTable
SET
  descriptions = ARRAY(
    SELECT AS STRUCT
      CASE 
        WHEN idx = 0 THEN STRUCT('es' AS language, 'test-es' AS text)
        WHEN idx = 1 THEN STRUCT('jp' AS language, 'test-jp' AS text)
        ELSE d.description 
      END AS description
    FROM UNNEST(descriptions) d WITH OFFSET idx
  )
WHERE
  id = '1'

这个写法会遍历原数组,根据索引匹配替换指定元素,保留其他元素不变。

注意事项

  • BigQuery的REPEATED RECORD类型本质是结构体数组,操作时必须用STRUCT()和数组语法,不能直接用JSON函数处理。
  • 执行UPDATE前建议先用SELECT语句验证构造的数组结构是否符合预期,避免数据错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:22:40