IBM Netezza中将后缀负号的字符型数字转换为标准数值的实现方法
IBM Netezza 后缀负号字符数值转标准数值解决方案
原有代码的问题在于没有做条件分支判断,对所有值统一拼接了前缀负号,才会导致正数转换错误。你可以通过CASE条件判断数值后缀是否为负号,分场景处理即可:
1. 整数场景转换(适配1-这类格式)
直接使用RIGHT函数取字段最后一位判断是否为负号,再分别处理:
CAST( CASE WHEN RIGHT(Numbers, 1) = '-' THEN '-' || SUBSTR(Numbers, 1, LENGTH(Numbers) - 1) ELSE Numbers END AS INT )
2. 带小数场景转换(适配1.000-这类格式)
如果需要保留小数位,把转换目标类型改为对应数值类型即可:
CAST( CASE WHEN RIGHT(Numbers, 1) = '-' THEN '-' || SUBSTR(Numbers, 1, LENGTH(Numbers) - 1) ELSE Numbers END AS NUMERIC(10,3) )
3. 直接求和示例
如果要直接对转换后的值求和,套入SUM函数即可:
SELECT SUM( CAST( CASE WHEN RIGHT(Numbers, 1) = '-' THEN '-' || SUBSTR(Numbers, 1, LENGTH(Numbers) - 1) ELSE Numbers END AS NUMERIC(10,3) ) ) AS total_sum FROM 你的表名;
兼容优化
如果原始数据存在首尾空格的情况,先通过TRIM处理避免判断出错:
CAST( CASE WHEN RIGHT(TRIM(Numbers), 1) = '-' THEN '-' || SUBSTR(TRIM(Numbers), 1, LENGTH(TRIM(Numbers)) - 1) ELSE TRIM(Numbers) END AS NUMERIC(10,3) )
内容的提问来源于stack exchange,提问作者Henrik
相关产品推荐
相关产品推荐

