BigQuery中INT64类型LENGTH函数报错及日期格式修正咨询
BigQuery SQL报错解决:INT64日期的长度判断与数值运算
核心问题分析
你遇到的报错是因为LENGTH()函数仅支持STRING或BYTES类型,不能直接用于INT64。下面针对你的两个问题逐一解答:
问题1:g_date保持INT64格式时,如何获取其“长度”(位数)?
可以做到,但不能直接用LENGTH(),有两种可行方案:
- 方案一:数值范围判断
8位的yyyymmdd格式INT64数值范围是10000000到99999999,直接用这个范围判断位数,完全不需要转换类型,性能更优:CASE WHEN deg.g_date BETWEEN 10000000 AND 99999999 THEN deg.g_date ELSE deg.g_date*100 + 1 END g_date - 方案二:临时转字符串判断
在CASE的条件判断环节,把INT64转成STRING用LENGTH(),但最终返回的结果还是INT64类型,既满足判断需求,又保持字段格式:CASE WHEN LENGTH(CAST(deg.g_date AS STRING)) = 8 THEN deg.g_date ELSE CAST(deg.g_date AS INT64)*100 + 1 END g_date
问题2:若g_date非INT64格式,能否执行乘以100加1的操作?
不行,非数值类型(比如STRING)无法直接做算术运算。必须先通过CAST(deg.g_date AS INT64)把它转换成INT64类型,再执行*100+1的计算——这其实就是你原代码里的正确写法,只要g_date的字符串内容是合法的整数(比如yyyymm格式的数字字符串)就能正常运行。
修正后的完整SQL
这里用数值范围判断的版本,效率更高:
SELECT deg.MASTER_PERSON_INDEX deg_mpi, deg.G_CIP cip, CASE WHEN deg.g_date BETWEEN 10000000 AND 99999999 THEN deg.g_date ELSE deg.g_date*100 + 1 END g_date, deg.g_ipeds ipeds, '0' deg FROM `graduation_di` deg WHERE deg.MASTER_PERSON_INDEX IS NOT NULL
内容的提问来源于stack exchange,提问作者Connor Hill
相关产品推荐
相关产品推荐

