BigQuery如何从结构体数组中返回仅含指定字段的新结构体数组
报错原因
你写的代码中,子查询会返回和原Skills数组长度一致的多行结构体结果,外层用[]包裹的方式只能接收单个元素构造数组,当原Skills数组长度大于1时就会触发Scalar subquery produced more than one element报错,同时你内外层表都用了dd作为别名,也会存在字段引用冲突的问题。
正确实现方案
有两种写法可以实现需求,推荐第二种更简洁:
写法1:手动指定保留字段(适合需要修改字段名的场景)
SELECT -- 用ARRAY函数将子查询返回的多行结果直接拼接为数组 ARRAY( SELECT STRUCT(skill.Level AS Level, skill.TypeId AS typeid) FROM UNNEST(dd.Skills) AS skill ) AS skills, -- 保留原表除Skills外的所有字段,保证结果和原数据结构一致 dd.* EXCEPT(Skills) FROM `your_project.your_dataset.tablee` AS dd
写法2:用EXCEPT语法自动剔除指定字段(仅删除字段场景下更高效)
如果不需要修改保留字段的名称,直接用* EXCEPT(字段名)就可以自动剔除不需要的字段,不需要手动列所有保留字段:
SELECT ARRAY( SELECT skill.* EXCEPT(Id) FROM UNNEST(dd.Skills) AS skill ) AS skills, dd.* EXCEPT(Skills) FROM `your_project.your_dataset.tablee` AS dd
内容的提问来源于stack exchange,提问作者elvainch
相关产品推荐
相关产品推荐

