Teradata中FormatNumber()等效实现及TO_CHAR函数报错解决
Teradata实现SQL Server Reporting数值格式化功能及等效函数说明
问题描述
原SQL Server Reporting中的表达式:
ToNumber(Left(FormatNumber([ColName];"00";1))需在Teradata中实现相同逻辑,尝试以下语句时出现报错:
CAST(SUBSTRING(TO_CHAR([ColName], '00') FROM 1 FOR 1) AS INTEGER)报错信息:
Failed [9881: HY000] Function 'TO_CHAR' called with an invalid number or type of parameters同时想了解Teradata中与
FormatNumber()等效的函数。
解决方案
1. 实现原表达式功能
原表达式逻辑:将[ColName]格式化为两位数字(不足两位补前导0),截取左起第一位后转为整数。
Teradata中不能直接用TO_CHAR('00')的方式补前导0,正确实现方式如下:
- 通用方案(适配数值/字符串类型的
[ColName]):
CAST(SUBSTRING(LPAD(TRIM(CAST([ColName] AS VARCHAR(2))), 2, '0') FROM 1 FOR 1) AS INTEGER)
- 整数字段简化方案:
如果[ColName]是整数类型,可直接通过数值运算取十位数字(小于10时结果为0,和原逻辑一致):
([ColName] / 10) % 10
2. Teradata中对应FormatNumber的替代方案
Teradata没有和SQL Server Reporting FormatNumber完全一致的单一函数,需根据需求组合函数:
- 补前导0固定位数:使用
LPAD函数,将数值转字符串后补0,例如LPAD(CAST([ColName] AS VARCHAR(2)), 2, '0') - 控制小数位数:用
CAST([ColName] AS DECIMAL(p,s))或ROUND([ColName], s)实现,其中s为小数位数 - 千分位/特殊格式:使用
TO_CHAR函数,需遵循Teradata格式规范,例如TO_CHAR(12345, '9,999')会返回'12,345';注意TO_CHAR不支持直接补前导0,需配合LPAD使用
内容的提问来源于stack exchange,提问作者user27056662
相关产品推荐
相关产品推荐

