BigQuery中未指定类型的NULL为何被识别为INT64?查询报错解析
BigQuery中NULL类型推断导致的运算符不匹配问题
问题重现
可正常执行的查询
select col1=col2 as col3 from ( select null as col1, cast(null as string) as col2 union all select "abc" as col1, "abc" as col2 )
执行结果:
| Row | col3 |
|---|---|
| 1 | null |
| 2 | true |
报错的查询
select col1=col2 as col3 from ( select null as col1, cast(null as string) as col2 )
报错信息:No matching signature for operator = for argument types: INT64, STRING. Supported signature: ANY = ANY at [2:3]
原因解释
BigQuery对未指定类型的NULL有默认类型推断规则:当没有上下文能明确NULL的类型时,会默认将其推断为INT64类型。
- 在带
UNION ALL的查询中,子查询的第二个分支明确将col1设为STRING类型("abc"),BigQuery在执行UNION ALL时会做类型兼容处理,自动把第一个分支中默认是INT64的col1转换为STRING类型,最终子查询的col1和col2都是STRING类型,因此col1=col2的比较可以正常执行。 - 在没有
UNION ALL的查询中,col1没有额外的类型参考上下文,BigQuery就会按默认规则把它推断为INT64类型;而col2被显式转换为STRING类型,两种类型无法直接用=运算符比较,因此触发了签名不匹配的报错。
如果要修复这个报错,只需要显式指定col1的类型,比如改为cast(null as string) as col1,让它和col2类型一致即可。
内容的提问来源于stack exchange,提问作者seeker
相关产品推荐
相关产品推荐

