在 MySQL 中去除小数点后多余的 0,并根据需求同时去除小数点(当结果为整数时),可通过以下方法实现:
一、核心方法
1.CAST + TRIM组合方案
SELECT
CASE
WHEN TRIM(TRAILING '.' FROM trimmed_value) = '' THEN '0'
ELSE TRIM(TRAILING '.' FROM trimmed_value)
END AS result
FROM (
SELECT TRIM(TRAILING '0' FROM CAST(your_column AS CHAR)) AS trimmed_value
) AS subquery;
效果说明:
- 123.4500 → 123.45
- 5.0000 → 5
- 0.0000 → 0
- 100.0 → 100
逻辑分析:
- CAST(your_column AS CHAR):将数值转为字符串,消除固定小数位格式。
- TRIM(TRAILING '0' FROM ...):去除字符串末尾的 0。
- TRIM(TRAILING '.' FROM ...):处理可能残留的小数点(如 5. → 5)。
- CASE 语句:避免纯 0 值(如 0.0000)处理后变为空字符串。
2. 0 + CAST隐式转换方案
SELECT
CASE
WHEN result LIKE '%.' THEN REPLACE(result, '.', '')
ELSE result
END AS final_result
FROM (
SELECT 0 + CAST(your_column AS CHAR) AS result
) AS subquery;
效果说明:
- 9.0000 → 9
- 7.5000 → 7.5
逻辑解析:
- 0 + CAST(...):通过隐式转换将字符串数值转为浮点数,自动去除末尾的 0。
- CASE 语句:处理类似 9. 的中间结果,直接去除小数点。
二、扩展方案
正则表达式替换
SELECT
REGEXP_REPLACE(
REGEXP_REPLACE(CAST(your_column AS CHAR), '0+$', ''),
'\\.$', ''
) AS result;
效果说明:
- 分两步正则匹配:先去除末尾的 0,再去除可能残留的小数点。
三、适用场景对比
方法 | 适用数据类型 | 边缘情况处理 | 性能 |
CAST + TRIM | DECIMAL/FLOAT | 完美处理 0 值 | 较高 |
0 + CAST | DECIMAL | 需额外处理小数点残留 | 中等 |
正则表达式 | 字符串/数值 | 依赖正则库支持 | 较低 |
四、完整示例
-- 示例表结构
CREATE TABLE test_data (value DECIMAL(18,4));
INSERT INTO test_data VALUES (123.4500), (5.0000), (0.0000), (100.0);
-- 执行查询
SELECT
original_value,
CASE
WHEN TRIM(TRAILING '.' FROM trimmed_value) = '' THEN '0'
ELSE TRIM(TRAILING '.' FROM trimmed_value)
END AS cleaned_value
FROM (
SELECT
value AS original_value,
TRIM(TRAILING '0' FROM CAST(value AS CHAR)) AS trimmed_value
FROM test_data
) AS subquery;
输出结果:
+----------------+---------------+
| original_value | cleaned_value |
+----------------+---------------+
| 123.4500 | 123.45 |
| 5.0000 | 5 |
| 0.0000 | 0 |
| 100.0 | 100 |
+----------------+---------------+
注意事项
- 数据类型兼容性:DECIMAL 类型更适合精确计算,而 FLOAT/DOUBLE 可能因精度问题导致结果不一致。
- 性能优化:频繁查询时建议在应用层处理格式化,避免数据库计算开销。
根据具体需求选择方法,推荐优先使用 CAST + TRIM 组合方案以覆盖所有边缘情况。