Redshift中float8转字符串拼接维度值遇精度及格式问题求助
解决Redshift中float8转字符串拼接的精度与格式问题
问题分析
- float8精度丢失:float8是二进制浮点类型,无法精确存储部分十进制小数(如16.7),直接转varchar会出现
16.699999999999999这类近似值。 - TO_CHAR格式冗余:使用
FM99D9会强制保留小数点,导致整数(如10)转成10.,不符合需求。 - 动态格式需求:需要根据数值是否有小数部分,自动决定是否显示小数点。
解决方案
方法一:TRIM+TO_CHAR组合处理
先将float8转成numeric类型规避精度问题,再通过两次TRIM去掉多余的末尾零和小数点:
SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM TO_CHAR(width::numeric, 'FM999999999D999'))) || 'X' || TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM TO_CHAR("length"::numeric, 'FM999999999D999'))) AS dimension FROM t;
方法二:正则表达式简化处理
用正则匹配并替换末尾的小数点和零,写法更简洁:
SELECT REGEXP_REPLACE(TO_CHAR(width::numeric, 'FM999999999D999'), '\.?0*$', '') || 'X' || REGEXP_REPLACE(TO_CHAR("length"::numeric, 'FM999999999D999'), '\.?0*$', '') AS dimension FROM t;
效果说明
- 当
width=10、length=16.7时,两种方法均返回10X16.7; - 当
length为整数(如20)时,返回10X20,自动隐藏多余的小数点; - 转numeric类型解决了float8转字符串的精度偏差问题。
内容的提问来源于stack exchange,提问作者mherzog
相关产品推荐
相关产品推荐

