使用NestJS+BigQuery更新嵌套数组字段时遇语法错误求助
解决BigQuery嵌套重复数组字段更新语法问题
错误原因分析
你之前的SQL语句存在两个核心问题:
- 语法格式错误:UPDATE的SET子句必须遵循
列名=表达式的格式,你直接写JSON_SET(...)未指定对应列名,触发语法报错。 - 类型不匹配:
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
相关产品推荐
相关产品推荐

