类别:

转换函数

TO_DECIMAL、TO_NUMBER、TO_NUMERIC

将输入表达式转换为定点数。对于 NULL 输入,输出为 NULL。

这些函数为同义函数。

另请参阅:

TRY_TO_DECIMAL、TRY_TO_NUMBER、TRY_TO_NUMERIC

语法

TO_DECIMAL( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TO_NUMBER( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TO_NUMERIC( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
Copy

实参

必填:

expr

数字、字符或变体类型的表达式。

可选:

format

用于解析输入 expr 和返回的 SQL 格式模型。有关更多信息,请参阅 SQL 格式模型

precision

生成的数字中十进制位数的最大数目;从 1 到 38。在 Snowflake 中,不使用精度来确定存储数字所需的字节数,并且对效率没有任何影响,因此默认值为最大值 (38)。

scale

小数十进制位数(从 0 到 precision - 1)。0 表示没有小数位数(即整数)。默认小数位数为 0。

返回

该函数返回 NUMBER(precision, scale)

  • 如果未指定 precision,则默认为 38。

  • 如果未指定 scale,则默认为 0。

使用说明

  • 对于 NULL 输入,结果为 NULL。

  • 对于定点数:

    • 具有不同小数位数的数字通过向右添加零(如果需要增加小数位数)或通过舍入(如果小数位数需要减小)来减少小数位数的方式进行转换。

    • 请注意,将定点数转换为增加小数位数的定点数可能会失败。

  • 对于浮点数:

    • 如果数字在给定小数位数的可表示范围内,则进行转换。

    • 二进制和十进制小数之间的转换并不精确。这可能会导致缺乏精度或超出范围错误。

    • 无穷大和 NaN (非数字)的值会导致转换错误。

  • 字符串转换为十进制数、整数、小数或浮点数。

    • 对于小数输入,推导出的精度为点后的位数。

    • 对于浮点输入,允许省略尾数或指数,并解释为 0。因此,E 解析为 0。

  • 对于 VARIANT 输入:

    • 如果变体包含定点数值或浮点数值,则执行相应的数值转换。

    • 如果变体包含字符串,则执行字符串转换。

    • 如果变体包含布尔值,则结果为 0 或 1(相应对应于 False 和 True)。

    • 如果变体包含 JSON null 值,则输出为 NULL。

示例

创建一个带有 VARCHAR 列的表,然后从表中检索字符串值,并将这些值传递给具有不同 precisionscale 值的 TO_NUMBER 函数。

CREATE OR REPLACE TABLE number_conv(expr VARCHAR);
INSERT INTO number_conv VALUES ('12.3456'), ('98.76546');

SELECT expr,
       TO_NUMBER(expr),
       TO_NUMBER(expr, 10, 1),
       TO_NUMBER(expr, 10, 8)
  FROM number_conv;
Copy

该查询会返回以下输出:

+----------+-----------------+------------------------+------------------------+
| EXPR     | TO_NUMBER(EXPR) | TO_NUMBER(EXPR, 10, 1) | TO_NUMBER(EXPR, 10, 8) |
|----------+-----------------+------------------------+------------------------|
| 12.3456  |              12 |                   12.3 |            12.34560000 |
| 98.76546 |              99 |                   98.8 |            98.76546000 |
+----------+-----------------+------------------------+------------------------+

尝试使用 TO_NUMBER 函数返回一个数字,其 precision10,小数位数为 9

SELECT expr, TO_NUMBER(expr, 10, 9) FROM number_conv;
Copy

precision 实参设置为 10 的情况下,结果中的最大十进制位数为 10。由于表中的两个值在小数点之前都有两位数,并且 scale 设置为 9,查询将返回错误,因为结果会返回 11 位数。

100039 (22003): Numeric value '12.3456' is out of range

在查询中将不同的 格式元素 与 TO_DECIMAL 函数配合使用:

SELECT column1,
       TO_DECIMAL(column1, '99.9') as D0,
       TO_DECIMAL(column1, '99.9', 9, 5) as D5,
       TO_DECIMAL(column1, 'TM9', 9, 5) as TD5
  FROM VALUES ('1.0'), ('-12.3'), ('0.0'), ('- 0.1');
Copy

该查询会返回以下输出:

+---------+-----+-----------+-----------+
| COLUMN1 |  D0 |        D5 |       TD5 |
|---------+-----+-----------+-----------|
| 1.0     |   1 |   1.00000 |   1.00000 |
| -12.3   | -12 | -12.30000 | -12.30000 |
| 0.0     |   0 |   0.00000 |   0.00000 |
| - 0.1   |   0 |  -0.10000 |  -0.10000 |
+---------+-----+-----------+-----------+

输出显示 TM9 最小文本格式元素根据指定的小数位数,精确打印小数部分的位数。有关更多信息,请参阅 最小文本数字格式

转换使用逗号分隔数字组的数字:

SELECT column1,
       TO_DECIMAL(column1, '9,999.99', 6, 2) as convert_number
  FROM VALUES ('3,741.72');
Copy

该查询会返回以下输出:

+----------+----------------+
| COLUMN1  | CONVERT_NUMBER |
|----------+----------------|
| 3,741.72 |        3741.72 |
+----------+----------------+

转换使用逗号分隔数字组的货币值:

SELECT column1,
       TO_DECIMAL(column1, '$9,999.99', 6, 2) as convert_currency
  FROM VALUES ('$3,741.72');
Copy

该查询会返回以下输出:

+-----------+------------------+
| COLUMN1   | CONVERT_CURRENCY |
|-----------+------------------|
| $3,741.72 |          3741.72 |
+-----------+------------------+

X 格式元素 与 TO_DECIMAL 函数配合使用,将十六进制值转换为十进制值:

SELECT TO_DECIMAL('ae5', 'XXX');
Copy

该查询会返回以下输出:

+--------------------------+
| TO_DECIMAL('AE5', 'XXX') |
|--------------------------|
|                     2789 |
+--------------------------+

格式元素中的位数必须大于或等于表达式中的位数。例如,尝试运行以下查询:

SELECT TO_DECIMAL('ae5', 'XX');
Copy

查询会返回错误:

100140 (22007): Can't parse 'ae5' as number with format 'XX'
语言: 中文