str是sql server专有函数,用于将数值转为右对齐字符型字符串,参数length指定总长度(含小数点、符号、空格),decimal指定小数位数;若length不足则返回空格或星号,结果末尾空格需rtrim清理。

STR 函数不是标准 SQL 函数,它只在 SQL Server(T-SQL)中存在;MySQL、PostgreSQL、Oracle 等主流数据库都不支持 STR —— 直接写会报错 Invalid column name 'STR' 或类似语法错误。
SQL Server 中 STR 的实际行为和参数含义
STR 是 T-SQL 里一个「带格式化意图但语义反直觉」的函数:它不按常规字符串拼接逻辑工作,而是以「右对齐 + 截断/补空格」方式输出固定宽度字符串。它的签名是 STR(float_expression [, length [, decimal]]):
-
float_expression必须是数值类型(如INT、FLOAT会被隐式转为FLOAT) -
length默认为 10,表示**整个结果字符串总长度**(含小数点、符号、空格),不是字符数上限 -
decimal控制小数位数,但仅当length足够容纳整数部分+小数点+小数时才生效;否则小数位被截掉,甚至整数部分也被截断 - 结果永远是
CHAR类型,末尾空格不会被自动RTRIM—— 这常导致比对或拼接出错
为什么 STR(123.456, 5, 2) 返回空格而不是 '123.46'
因为 length = 5 不够:整数部分“123”占 3 位,小数点 1 位,2 位小数 → 至少需 6 位。SQL Server 会返回全空格字符串(' '),而不是报错或截断。这是最易踩的坑:
-
STR(123.456, 6, 2)→'123.46'(刚好够) -
STR(123.456, 7, 2)→' 123.46'(左补空格,总长 7) -
STR(-123.456, 7, 2)→'-123.46'(负号占一位,不再补空格) - 用
RTRIM(STR(...))才能安全参与后续字符串操作
更可靠、跨库兼容的替代方案
除非你明确锁定 SQL Server 且需要右对齐空格格式,否则应避免 STR。推荐以下写法:
- SQL Server:用
FORMAT(value, 'N2')(返回NVARCHAR,无多余空格,但性能略低)或CAST(ROUND(value, 2) AS VARCHAR) - MySQL:用
ROUND(value, 2)配合CAST(... AS CHAR)或直接CONCAT('', value) - PostgreSQL:用
TO_CHAR(value, 'FM999999999.00')(FM去前导空格) - 通用兜底:先
CAST或CONVERT成字符串类型,再按需REPLACE或SUBSTRING处理精度
真正要注意的是:不同数据库对隐式转换、精度舍入规则(如 0.5 向上还是向偶)、以及空格填充的处理完全不同。STR 的「平滑」只是幻觉,它的行为边界模糊,且无法控制舍入模式(总是四舍五入)。如果业务要求确定的精度和格式,必须显式用 ROUND + 字符串转换组合,而不是依赖 STR 的黑盒逻辑。










