类别:

转换函数

TO_DECIMAL、TO_NUMBER、TO_NUMERIC

Converts an input expression to a fixed-point number.

这些函数为同义函数。

另请参阅:

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

The maximum number of decimal digits in the resulting number, from 1 to 38. In Snowflake, precision isn't used to determine the number of bytes that are needed to store the number and doesn't have any effect on efficiency, so the default is the maximum (38).

scale

The number of fractional decimal digits (from 0 to precision - 1). 0 indicates no fractional digits; that is, an integer number. The default scale is 0.

返回

The function returns a value of type NUMBER with the following defaults:

  • If the precision isn't specified, then it defaults to 38.

  • If the scale isn't specified, then it defaults to 0.

For NULL input, returns 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'
语言: 中文