如何在Impala SQL中将科学计数法格式的custno转换为整数
解决Impala SQL中科学计数法字符串转整数的问题
嘿,我来帮你搞定这个科学计数法转常规整数的问题~
首先得说下你之前尝试的写法存在的小问题:直接把custno转成FLOAT再转INT,可能会因为浮点数的精度限制导致数值失真——毕竟FLOAT是近似数值类型,对于一些大整数的解析会有误差,比如原本的5.0256926E7(也就是50256926),转成FLOAT后可能会变成类似50256928的错误值,再转INT就得不到正确结果了。
给你两个更靠谱的解决方案:
方案1:用DECIMAL做中间转换(精确解析)
先把科学计数法字符串转成精确的DECIMAL类型,再转成整数,这样能完全避免精度损失:
SELECT CAST(CAST(custno AS DECIMAL(18, 0)) AS BIGINT) AS custno_int FROM z9_strategy.dstool_model_data_m WHERE snapshot_date_key = 20170630 AND custtype_ind = 1 AND retailer_retail = 1;
这里DECIMAL(18,0)的参数可以根据你的实际数值大小调整,确保能容纳所有custno的数值;最后转成BIGINT是为了兼容更大的数值范围,如果你确定所有数值都在INT(32位,最大值2147483647)范围内,也可以用INT。
方案2:直接使用TO_BIGINT函数(更简洁)
Impala的TO_BIGINT函数支持直接解析科学计数法格式的字符串,一步到位:
SELECT TO_BIGINT(custno) AS custno_int FROM z9_strategy.dstool_model_data_m WHERE snapshot_date_key = 20170630 AND custtype_ind = 1 AND retailer_retail = 1;
这个写法更简洁,而且同样能保证数值的精确性,非常适合你的场景。
另外还要提醒下:如果你的custno字段里存在非科学计数法的数值(比如普通整数字符串),这两种方案也能正常解析,兼容性很好哦~
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

