BigQuery中匿名结构体TO_JSON转换异常及替代方法咨询
解决BigQuery匿名结构体TO_JSON截断问题
当对BigQuery中的匿名结构体(比如(1,2,3))使用TO_JSON()函数时,由于所有键被识别为空字符串,序列化后仅保留第一个值,后续值会被截断。例如执行以下语句:
SELECT val, TO_JSON(val) FROM UNNEST([(1,2,3)]) as val
返回的TO_JSON(val)结果仅为{"":1},而非BigQuery UI中展示的带通用键(如field0、field1)的JSON格式。
以下是几种替代方案:
方案1:用STRUCT函数生成带通用键的结构
这是处理固定元素数量匿名结构体最简便的方法,直接将匿名结构体转为命名结构体:
SELECT val, TO_JSON(STRUCT(val.*)) FROM UNNEST([(1,2,3)]) as val
执行后会生成{"field0":1,"field1":2,"field2":3}格式的JSON,和UI展示效果一致。
方案2:动态生成带索引键的JSON(适配任意元素数量)
如果匿名结构体的元素数量不固定,可以结合UNNEST、OFFSET和OBJECT_AGG生成通用键值对:
WITH data AS ( SELECT val FROM UNNEST([(1,2,3), (4,5)]) as val ) SELECT val, TO_JSON(OBJECT_AGG(CONCAT('field', offset), value)) AS json_result FROM data, UNNEST([val.*]) AS value WITH OFFSET GROUP BY val
该语句会为每个元素生成fieldN格式的键,最终输出如{"field0":1,"field1":2,"field2":3}的JSON。
方案3:转为数组格式JSON
如果接受数组形式的JSON输出,可以直接将匿名结构体转为数组后序列化:
SELECT val, TO_JSON_STRING([val.*]) FROM UNNEST([(1,2,3)]) as val
返回结果为[1,2,3],适合不需要键名的场景。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

