如何在Snowflake中去除数值列末尾的多余零?
INT列去除末尾多余零的实现方案
INT类型数值本身存储不存在末尾多余零,你描述的场景大概率是原始值按固定倍率(如10000倍)放大转为INT存储(避免小数精度丢失),需要移除缩放带来的后缀零,以下是不同主流数据库的可落地实现方案:
1. 字符串处理方案(兼容性好)
- MySQL 写法
-- 基础写法 SELECT CAST(TRIM(TRAILING '0' FROM CAST(目标列名 AS CHAR)) AS UNSIGNED) AS 处理后数值 FROM 你的表名; -- 兼容值为0的场景,避免返回空 SELECT IF(目标列名 = 0, 0, CAST(TRIM(TRAILING '0' FROM CAST(目标列名 AS CHAR)) AS UNSIGNED)) AS 处理后数值 FROM 你的表名;
- PostgreSQL 写法
-- 基础写法 SELECT (regexp_replace(目标列名::TEXT, '0+$', ''))::INTEGER AS 处理后数值 FROM 你的表名; -- 兼容0值写法 SELECT CASE WHEN 目标列名 = 0 THEN 0 ELSE (regexp_replace(目标列名::TEXT, '0+$', ''))::INTEGER END AS 处理后数值 FROM 你的表名;
- SQL Server 写法
SELECT CAST(REVERSE(LTRIM(REVERSE(CAST(目标列名 AS VARCHAR(20))))) AS INT) AS 处理后数值 FROM 你的表名;
2. 数学运算方案(性能更优)
不依赖字符串函数,适合大表批量计算场景:
SELECT 目标列名 / POWER(10, CASE WHEN 目标列名 = 0 THEN 0 ELSE LEN(CAST(目标列名 AS VARCHAR)) - LEN(CAST(CAST(REVERSE(CAST(目标列名 AS VARCHAR)) AS BIGINT) AS VARCHAR)) END ) AS 处理后数值 FROM 你的表名
以上方案对输入为30000、100000、200000、200000的测试用例,输出结果均为3、10、20、20,完全匹配需求。
内容的提问来源于stack exchange,提问作者lalaland
相关产品推荐
相关产品推荐

