BigQuery STRING数组字段非空返回本身、为空返回0实现报错问题
报错根因
BigQuery的IF函数要求两个返回分支的数据类型必须完全一致,你当前代码的IF分支1返回ARRAY<STRING>类型的url数组,分支2返回INT64类型的数值0,类型不匹配触发该报错。
另外注意:REGEXP_EXTRACT_ALL无匹配结果时返回的是空数组[]而非NULL,你原来写的url is not NULL判断无法覆盖空数组的场景,不符合你「数组非空才返回本身」的需求。
解决方案
根据你最终需要的返回值类型,可选择以下两种方案:
方案1:统一返回ARRAY类型(推荐,保留数组结构)
空/无匹配时返回包含字符串'0'的数组,和原url数组类型一致,修改后的完整SQL如下:
WITH temp_ as( SELECT ASE_IDD, REGEXP_EXTRACT_ALL( DESCRIPTION, r"regex_placeholder") as url FROM `table`) SELECT ASE_IDD, IF(ARRAY_LENGTH(url) > 0, url, ['0']) AS url FROM temp_
方案2:统一返回STRING类型
如果需要输出扁平的字符串而非数组,可以把非空数组转为JSON字符串,空匹配时返回字符串'0':
WITH temp_ as( SELECT ASE_IDD, REGEXP_EXTRACT_ALL( DESCRIPTION, r"regex_placeholder") as url FROM `table`) SELECT ASE_IDD, IF(ARRAY_LENGTH(url) > 0, TO_JSON_STRING(url), '0') AS url FROM temp_
内容的提问来源于stack exchange,提问作者lipo
相关产品推荐
相关产品推荐

