- 类别:
TRY_TO_DECIMAL、TRY_TO_NUMBER、TRY_TO_NUMERIC¶
TO_DECIMAL、TO_NUMBER、TO_NUMERIC 的特殊版本,它执行相同的操作(即将输入表达式转换为定点数),但支持错误处理(即,如果无法执行转换,它将返回 NULL 值而不是引发错误)。
这些函数为同义函数。
有关更多信息,请参阅 错误处理转换函数。
语法¶
TRY_TO_DECIMAL( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TRY_TO_NUMBER( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TRY_TO_NUMERIC( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
实参¶
必填:
string_expr
类型 VARCHAR 的表达式。
可选:
format
用于解析输入
expr
和返回的 SQL 格式模型。有关更多信息,请参阅 SQL 格式模型。precision
生成的数字中十进制位数的最大数目;从 1 到 38。在 Snowflake 中,不使用精度来确定存储数字所需的字节数,并且对效率没有任何影响,因此默认值为最大值 (38)。
scale
小数十进制位数(从 0 到
precision
- 1)。0 表示没有小数位数(即整数)。默认小数位数为 0。
返回¶
该函数返回 NUMBER(p,s)
,其中 p 是 precision
,s 是 scale
。
如果未指定 precision
,则默认为 38。
如果未指定 scale
,则默认为 0。
使用说明¶
输入必须是字符串表达式。
示例¶
第一个示例失败,因为最后一列 (dec_with_range_error
) 没有存储足够的有效数字来保存要求保存的值。
SELECT column1 AS orig_string,
TO_DECIMAL(column1) AS dec,
TO_DECIMAL(column1, 10, 2) AS dec_with_scale,
TO_DECIMAL(column1, 4, 2) AS dec_with_range_err
FROM VALUES ('345.123');
100039 (22003): Numeric value '345.123' is out of range
下一个查询与上一个查询相同,只是使用 TRY_TO_DECIMAL 而不是 TO_DECIMAL,因此会将超出范围的值转换为 NULL。
SELECT column1 AS orig_string,
TRY_TO_DECIMAL(column1) AS dec,
TRY_TO_DECIMAL(column1, 10, 2) AS dec_with_scale,
TRY_TO_DECIMAL(column1, 4, 2) AS dec_with_range_err
FROM VALUES ('345.123');
+-------------+-----+----------------+--------------------+
| ORIG_STRING | DEC | DEC_WITH_SCALE | DEC_WITH_RANGE_ERR |
|-------------+-----+----------------+--------------------|
| 345.123 | 345 | 345.12 | NULL |
+-------------+-----+----------------+--------------------+
下一个示例失败,因为输入字符串包含美元符号和一个逗号来分隔数字组,而不仅仅是数字和小数点。但最后一列的格式说明符并没有告诉 TO_DECIMAL 函数预期会出现美元符号。
SELECT column1 AS orig_string,
TO_DECIMAL(column1, '$9,999.00') AS num,
TO_DECIMAL(column1, '$9,999.00', 6, 2) AS num_with_scale,
TO_DECIMAL(column1, 6, 2) AS num_with_format_err
FROM VALUES ('$7,543.21');
100038 (22018): Numeric value '$7,543.21' is not recognized
下一个查询与上一个查询相同,只是使用 TRY_TO_DECIMAL 而不是 TO_DECIMAL,因此会将输入值转换为 NULL。
SELECT column1 AS orig_string,
TRY_TO_DECIMAL(column1, '$9,999.00') AS num,
TRY_TO_DECIMAL(column1, '$9,999.00', 6, 2) AS num_with_scale,
TRY_TO_DECIMAL(column1, 6, 2) AS num_with_format_err
FROM VALUES ('$7,543.21');
+-------------+------+----------------+---------------------+
| ORIG_STRING | NUM | NUM_WITH_SCALE | NUM_WITH_FORMAT_ERR |
|-------------+------+----------------+---------------------|
| $7,543.21 | 7543 | 7543.21 | NULL |
+-------------+------+----------------+---------------------+