BigQuery:将含空/Null结构体的数组压缩为单条Null记录
解决BigQuery合并列生成数组时的空结构体问题
你可以通过先筛选有效结构体、再处理全空场景的方式解决这个问题,避免生成多个冗余的空结构体记录。以下是修正后的查询语句:
SELECT IF(ARRAY_LENGTH(valid_labels) = 0, [STRUCT(NULL AS key, NULL AS value)], valid_labels) AS labels FROM ( SELECT ARRAY_CONCAT( -- 仅当colA有效时生成对应结构体数组,否则为空数组 IF(colA IS NOT NULL AND TRIM(colA) != "", [STRUCT("center" AS key, colA AS value)], []), -- 仅当colB有效时生成对应结构体数组,否则为空数组 IF(colB IS NOT NULL AND TRIM(colB) != "", [STRUCT("owner" AS key, colB AS value)], []) ) AS valid_labels FROM `project.dataset.bill` );
逻辑说明
- 筛选有效结构体:对
colA和colB分别判断,仅当值非空且非空白字符串时,生成包含对应STRUCT的数组;否则生成空数组。 - 合并有效数组:用
ARRAY_CONCAT合并两个数组,此时数组中仅包含有效的结构体记录,不会有冗余的空结构体。 - 处理全空场景:如果合并后的数组长度为0(即两列都无效),则替换为包含单个
(NULL, NULL)结构体的数组;否则直接使用合并后的有效数组。
这样就能实现你需要的效果:有效列保留对应结构体,两列都为空时仅保留一条空结构体记录。
内容的提问来源于stack exchange,提问作者mehere
相关产品推荐
相关产品推荐

