You need to enable JavaScript to run this app. 如何让含整数小数的数据库列隐藏零小数保留非零小数?附CAST尝试
优惠活动
大模型
产品
解决方案
定价
更多

如何让含整数小数的数据库列隐藏零小数保留非零小数?附CAST尝试

现有写法的问题
  • 直接执行cast(col1 as decimal)达不到预期效果,核心原因有两点:
    1. 不带参数的decimal默认规则不统一:多数数据库的无参decimal会默认取0个小数位,会直接把66.2、99.6这类带小数的值四舍五入成整数;如果手动给decimal指定固定小数位(比如写cast(col1 as decimal(10,1))),又会强制给所有值补全到对应位数,比如98会被显示成98.0,完全不符合"整数不带小数点"的要求。
    2. 所有数值类型(int、decimal、浮点型)本质上只存数值本身的大小,不存显示格式。比如99和99.0在数值层面是完全等价的,不存在"整数、一位小数"的区别,只要最终输出的是数值类型,数据库客户端就会按照固定规则渲染,根本做不到"整的显整、带小数的留原位数"的灵活显示。
正确的实现逻辑

你要的效果本质是格式化展示,不是数值类型转换,因此最终输出的列必须是字符串类型,通过分支判断区分格式:

  • 判断当前值的小数部分是否为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 12:15:04