You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

T-SQL中如何将小数部分为0的DECIMAL数值显示为整数?

DECIMAL类型数值格式化实现:整数去小数位、非整数保留原小数

需求样例

Column1AmountDesiredOutput
Item185.0085
Item252.2552.25
Item336.8536.85
Item467.0067

需要实现的格式化规则:

  • 数值小数部分为0时,显示为整数格式(去掉.00后缀)
  • 数值小数部分非0时,保留原有小数格式显示

当前尝试的代码未达到预期效果,其中Amount字段数据类型为DECIMAL:

CASE 
      WHEN Amount % 1 = 0 THEN CAST (AMOUNT AS INT)
      ELSE Amount    
END as [DesiredOutput]

代码失效原因

你的判断逻辑本身没有问题,问题出在SQL的CASE表达式强制类型统一规则:所有分支的返回值必须为同一数据类型,引擎会自动选取所有分支中数据类型优先级最高的类型,对所有分支返回值做隐式转换。DECIMAL类型的优先级高于INT,因此即使你在小数为0的分支中将值转换为INT,最终输出时仍会被隐式转换回DECIMAL类型,自然会保留.00的小数后缀,无法达到预期显示效果。

实现方案

这类按值动态调整显示格式的需求本质属于展示层逻辑,若需要直接在SQL层实现,必须将最终结果转换为字符串类型输出,才能同时兼容整数、带小数两种显示格式,不同主流数据库的常用写法如下:

  • SQL Server
    用内置FORMAT函数写法最简洁,会自动截断末尾无意义的0:
    SELECT FORMAT(Amount, '0.##') AS DesiredOutput FROM 你的表名
    
    低版本SQL Server不支持FORMAT时,可手动分支转换字符串:
    SELECT
      CASE WHEN Amount % 1 = 0 THEN CAST(CAST(Amount AS INT) AS VARCHAR(20))
           ELSE CAST(Amount AS VARCHAR(20))
      END AS DesiredOutput
    FROM 你的表名
    
  • MySQL
    可通过TRIM函数逐层去除末尾多余的0和小数点:
    SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM Amount)) AS DesiredOutput FROM 你的表名;
    
    也可通过隐式转换简写实现:
    SELECT FORMAT(Amount, 2) + 0 AS DesiredOutput FROM 你的表名;
    

以上写法的输出结果完全匹配需求样例:小数部分为0的数值会显示为纯整数,带非0小数的数值会保留原有小数位,不会出现整数强制带.00后缀的问题。


内容的提问来源于stack exchange,提问作者BenTuran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:45:32