BigQuery中父列为空时如何让嵌套上层字段直接置为NULL?
在BigQuery中实现嵌套STRUCT的NULL值优化
这个需求完全可以实现,核心问题是你原查询里的NULL判断逻辑有误,同时需要明确触发values字段置为NULL的条件。
原查询的问题
SQL中不能用WHEN NULL来匹配NULL值,因为NULL和任何值(包括自身)的比较结果都是NULL,不会触发匹配分支。所以你的原查询会始终进入ELSE分支,哪怕fields.valuesFiled本身就是NULL,最终生成子字段全为NULL的STRUCT。
正确的实现方案
我们需要明确两个触发条件:
- 当
fields.valuesFiled本身为NULL时,直接将values设为NULL - 当
fields.valuesFiled存在,但它的所有子字段(value1、value2)都为NULL时,也将values设为NULL
对应的查询语句如下:
SELECT id, STRUCT( CASE WHEN fields.valuesFiled IS NULL OR (fields.valuesFiled.value1 IS NULL AND fields.valuesFiled.value2 IS NULL) THEN NULL ELSE STRUCT( fields.valuesFiled.value1, fields.valuesFiled.value2 ) END AS values ) AS fields FROM tableName;
如果你的需求仅针对fields.valuesFiled本身为NULL的场景(不考虑子字段全为NULL的情况),可以简化为:
SELECT id, STRUCT( IF(fields.valuesFiled IS NULL, NULL, STRUCT( fields.valuesFiled.value1, fields.valuesFiled.value2 )) AS values ) AS fields FROM tableName;
验证结果
执行上述查询后,对应的JSON输出会符合你的期望:
- 当
fields.valuesFiled存在且子字段有有效值时,生成包含对应字符串的STRUCT - 当
fields.valuesFiled为NULL或子字段全为NULL时,values字段直接置为NULL
内容的提问来源于stack exchange,提问作者arthurenc
相关产品推荐
相关产品推荐

