类别:

转换函数

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> ] ] )
Copy

实参

必填:

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');
Copy
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');
Copy
+-------------+-----+----------------+--------------------+
| 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');
Copy
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');
Copy
+-------------+------+----------------+---------------------+
| ORIG_STRING |  NUM | NUM_WITH_SCALE | NUM_WITH_FORMAT_ERR |
|-------------+------+----------------+---------------------|
| $7,543.21   | 7543 |        7543.21 |                NULL |
+-------------+------+----------------+---------------------+
语言: 中文