如何在BigQuery中区分整数类型与字符串存储的整数
BigQuery动态值类型区分解决方案
你之前使用SAFE_CAST无法区分的核心原因是:原生INT64可以被安全转为STRING,STRING格式的合法整数也可以被安全转为INT64,两个判断条件都不会返回NULL,自然无法完成区分,可根据实际场景选择以下方案:
场景1:待检测值存储在JSON类型字段中
直接使用BigQuery内置的JSON_TYPE函数,可直接返回JSON值的原生类型,示例代码如下:
SELECT CASE JSON_TYPE(json_field.target_key) WHEN 'number' THEN '原生INT64数值类型' WHEN 'string' THEN 'STRING类型存储的整数值' ELSE '其他非目标类型' END AS value_type, COUNT(*) AS type_count FROM `项目名.数据集名.表名` GROUP BY value_type
场景2:待检测值为UNION(联合)类型字段
使用BigQuery内置的SQL_TYPEOF函数,可直接返回动态类型值的SQL数据类型,示例代码如下:
SELECT CASE SQL_TYPEOF(union_field) WHEN 'INT64' THEN '原生INT64类型' WHEN 'STRING' THEN 'STRING类型' ELSE '其他非目标类型' END AS value_type, COUNT(*) AS type_count FROM `项目名.数据集名.表名` GROUP BY value_type
特殊场景:多表联合查询导致类型隐式转换
如果你是将不同类型的列UNION后才无法通过原表schema获取类型,可以在UNION阶段主动添加类型标记字段,无需额外检测:
SELECT column_value, 'INT64' AS original_type FROM int_type_table UNION ALL SELECT column_value, 'STRING' AS original_type FROM string_type_table
内容的提问来源于stack exchange,提问作者Shravani_reddie
相关产品推荐
相关产品推荐

