在SQL查询场景中,我们经常会遇到数值展示不符合预期的问题,比如金额需要保留两位小数并添加千分位分隔符,百分比需要显示为带百分号的格式,这些需求都可以通过FORMAT函数来实现。FORMAT函数能够对数值进行格式化处理,按照指定的格式字符串返回对应的显示结果,大幅提升了数值的可读性。

FORMAT函数基本语法
FORMAT函数的通用语法结构如下,不同数据库的实现可能存在细微差异,但核心逻辑一致:
-- 通用语法 FORMAT(数值表达式, 格式字符串 [, 文化区域代码]) -- 数值表达式:需要格式化的原始数值,可以是字段名、数值常量或者计算表达式 -- 格式字符串:指定数值的显示格式,比如保留小数位数、千分位分隔等 -- 文化区域代码:可选参数,指定不同地区的格式规则,比如不同地区的小数点、千分位符号可能不同
常见格式化场景示例
1. 数值保留指定小数位数
当需要将数值保留两位小数的时候,可以使用格式字符串#.00,其中#代表可选的数字位,0代表必须显示的数字位:
-- 保留两位小数的示例
SELECT
FORMAT(123.456, '0.00') AS 格式化结果1,
FORMAT(123.4, '0.00') AS 格式化结果2,
FORMAT(123, '0.00') AS 格式化结果3;
-- 返回结果分别为 123.46、123.40、123.00
2. 添加千分位分隔符
对于较大的数值,添加千分位分隔符可以提升可读性,格式字符串#,##0可以实现这个效果:
-- 添加千分位分隔符示例
SELECT
FORMAT(1234567.89, '#,##0.00') AS 格式化结果;
-- 返回结果为 1,234,567.89
3. 百分比格式显示
如果需要将小数转换为百分比格式,可以使用格式字符串0.00%,函数会自动将数值乘以100并添加百分号:
-- 百分比格式示例
SELECT
FORMAT(0.1234, '0.00%') AS 格式化结果;
-- 返回结果为 12.34%
4. 金额格式显示
金额场景通常需要添加货币符号,同时保留两位小数和千分位分隔,不同地区的货币符号不同,可以通过文化区域代码控制:
-- 人民币金额格式示例,zh-CN代表中文中国地区
SELECT
FORMAT(1234.5, 'C', 'zh-CN') AS 人民币金额;
-- 返回结果为 ¥1,234.50
-- 美元金额格式示例,en-US代表英文美国地区
SELECT
FORMAT(1234.5, 'C', 'en-US') AS 美元金额;
-- 返回结果为 $1,234.50
不同数据库的兼容性说明
FORMAT函数并非所有SQL数据库都支持,以下是常见数据库的兼容情况:
| 数据库类型 | 是否支持FORMAT函数 | 替代方案 |
|---|---|---|
| MySQL | 支持,5.5及以上版本可用 | 无 |
| SQL Server | 支持,2012及以上版本可用 | 无 |
| PostgreSQL | 不支持 | 使用TO_CHAR函数实现类似功能 |
| Oracle | 不支持 | 使用TO_CHAR函数实现类似功能 |
使用注意事项
- FORMAT函数的返回结果是字符串类型,而不是数值类型,如果需要后续进行数值计算,不建议直接对格式化后的结果做运算。
- 格式字符串中的占位符需要根据需求选择,#只会显示有效数字,0会强制补位,比如
#.##对于数值123.4会返回123.4,而0.00会返回123.40。 - 文化区域代码如果不指定,默认会使用当前数据库实例的默认区域设置,不同环境可能返回不同的格式结果,建议明确指定该参数保证结果一致。
PostgreSQL替代方案示例
因为PostgreSQL不支持FORMAT函数,我们可以使用TO_CHAR函数实现相同的数值格式化效果:
-- PostgreSQL中保留两位小数的示例 SELECT TO_CHAR(123.456, 'FM999999999.00') AS 格式化结果; -- 返回结果为 123.46 -- PostgreSQL中添加千分位分隔符的示例 SELECT TO_CHAR(1234567.89, 'FM999,999,999.00') AS 格式化结果; -- 返回结果为 1,234,567.89