如何让含整数小数的数据库列隐藏零小数保留非零小数?附CAST尝试
现有写法的问题
- 直接执行
cast(col1 as decimal)达不到预期效果,核心原因有两点:- 不带参数的decimal默认规则不统一:多数数据库的无参decimal会默认取0个小数位,会直接把66.2、99.6这类带小数的值四舍五入成整数;如果手动给decimal指定固定小数位(比如写
cast(col1 as decimal(10,1))),又会强制给所有值补全到对应位数,比如98会被显示成98.0,完全不符合"整数不带小数点"的要求。 - 所有数值类型(int、decimal、浮点型)本质上只存数值本身的大小,不存显示格式。比如99和99.0在数值层面是完全等价的,不存在"整数、一位小数"的区别,只要最终输出的是数值类型,数据库客户端就会按照固定规则渲染,根本做不到"整的显整、带小数的留原位数"的灵活显示。
- 不带参数的decimal默认规则不统一:多数数据库的无参decimal会默认取0个小数位,会直接把66.2、99.6这类带小数的值四舍五入成整数;如果手动给decimal指定固定小数位(比如写
正确的实现逻辑
你要的效果本质是格式化展示,不是数值类型转换,因此最终输出的列必须是字符串类型,通过分支判断区分格式:
- 判断当前值的小数部分是否为0(即当前值和它向下取整的结果是否相等)
- 相等的话,转成不带小数点的整数字符串
- 不相等的话,转成保留原有小数位的字符串
可直接复用的实现语句
主流数据库通用的写法参考:
select case -- 小数部分为0时,输出整数字符串 when col1 = floor(col1) then cast(cast(col1 as signed) as char) -- 小数部分非0时,输出保留原小数位的字符串 else trim(cast(col1 as char)) end as col1 from 你的表名
实际效果匹配
拿你给出的示例数据跑上面的语句,输出完全符合预期:
- 98:满足小数为0的判断,输出
98 - 99.0:数值和99完全相等,满足判断,输出
99 - 66.2:小数部分非0,走else分支输出
66.2 - 99.6:小数部分非0,走else分支输出
99.6 - 76:满足小数为0的判断,输出
76
小提示:如果用的是Oracle、PostgreSQL这类数据库,只要把语句里的取整函数、类型转换函数换成对应数据库的语法就行,核心判断逻辑是通用的。
内容的提问来源于stack exchange,提问作者Helpmedaddy
相关产品推荐
相关产品推荐

