- 类别:
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。
返回¶
The function returns a value of type NUMBER with the following defaults:
如果未指定
precision,则默认为 38。如果未指定
scale,则默认为 0。
If the conversion can't be performed or the input is NULL, returns NULL.
使用说明¶
输入必须是字符串表达式。
示例¶
第一个示例失败,因为最后一列 (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 |
+-------------+------+----------------+---------------------+
The following example fails because the input expression contains characters that aren't digits:
SELECT column1 AS orig_string,
TO_DECIMAL(column1) AS num
FROM VALUES ('aaa');
100038 (22018): Numeric value 'aaa' is not recognized
下一个查询与上一个查询相同,只是使用 TRY_TO_DECIMAL 而不是 TO_DECIMAL,因此会将输入值转换为 NULL。
SELECT column1 AS orig_string,
TRY_TO_DECIMAL(column1) AS num
FROM VALUES ('aaa');
+-------------+------+
| ORIG_STRING | NUM |
|-------------+------|
| aaa | NULL |
+-------------+------+
You can perform the conversion if you specify the X format element with the TO_DECIMAL or TRY_TO_DECIMAL function to convert a hexadecimal value to a decimal value:
SELECT column1 AS orig_string,
TO_DECIMAL(column1, 'XXX') AS to_decimal_num,
TRY_TO_DECIMAL(column1, 'XXX') AS try_to_decimal_num
FROM VALUES ('aaa');
+-------------+----------------+--------------------+
| ORIG_STRING | TO_DECIMAL_NUM | TRY_TO_DECIMAL_NUM |
|-------------+----------------+--------------------|
| aaa | 2730 | 2730 |
+-------------+----------------+--------------------+
For additional examples, see TO_DECIMAL、TO_NUMBER、TO_NUMERIC.