如何实现SQL查询保留两位小数,零值与NULL值无小数位?
问题原因分析
你的问题出在CASE表达式的类型自动统一上:当CASE的两个分支返回不同数据类型时(比如一个返回整数0,另一个返回decimal(10,2)),数据库会自动将低精度的整数类型转换为高精度的decimal类型,导致所有结果都被强制带上两位小数。
解决方案
要实现这种差异化的显示格式,需要将结果转换为字符串类型,通过格式化函数控制输出逻辑:
针对不同数据库的写法
1. SQL Server
使用FORMAT函数直接指定格式:
SELECT CASE WHEN COALESCE(number, 0) = 0 THEN '0' ELSE FORMAT(number, 'N2') END AS "My number" FROM Mytable
FORMAT(number, 'N2')会为非零值自动保留两位小数,零值和NULL值则直接输出字符串'0'。
2. MySQL
可以用FORMAT函数,或者结合ROUND和字符串拼接:
-- 方法1:使用FORMAT函数 SELECT CASE WHEN COALESCE(number, 0) = 0 THEN '0' ELSE FORMAT(number, 2) END AS `My number` FROM Mytable; -- 方法2:ROUND+字符串拼接 SELECT CASE WHEN COALESCE(number, 0) = 0 THEN '0' ELSE CONCAT(ROUND(number, 2), '') END AS `My number` FROM Mytable;
3. Oracle
使用TO_CHAR自定义格式模型:
SELECT CASE WHEN COALESCE(number, 0) = 0 THEN '0' ELSE TO_CHAR(number, '99999999.99') END AS "My number" FROM Mytable;
注意:格式模型99999999.99需要根据你的数值范围调整,避免数值过大时输出#号。
补充说明
如果要求必须返回数值类型(而非字符串),这种差异化显示逻辑无法在SQL层面实现——因为数值类型本身不存储显示格式,所有格式化操作都需要在客户端(比如报表工具、应用程序)中完成。
内容的提问来源于stack exchange,提问作者roscoe
相关产品推荐
相关产品推荐

