- 类别:
TO_DECIMAL、TO_NUMBER、TO_NUMERIC¶
将输入表达式转换为定点数。对于 NULL 输入,输出为 NULL。
这些函数为同义函数。
语法¶
TO_DECIMAL( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TO_NUMBER( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TO_NUMERIC( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
实参¶
必填:
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 列的表,然后从表中检索字符串值,并将这些值传递给具有不同 precision
和 scale
值的 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;
该查询会返回以下输出:
+----------+-----------------+------------------------+------------------------+
| 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 函数返回一个数字,其 precision
为 10
,小数位数为 9
。
SELECT expr, TO_NUMBER(expr, 10, 9) FROM number_conv;
在 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');
该查询会返回以下输出:
+---------+-----+-----------+-----------+
| 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');
该查询会返回以下输出:
+----------+----------------+
| 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');
该查询会返回以下输出:
+-----------+------------------+
| COLUMN1 | CONVERT_CURRENCY |
|-----------+------------------|
| $3,741.72 | 3741.72 |
+-----------+------------------+
将 X 格式元素 与 TO_DECIMAL 函数配合使用,将十六进制值转换为十进制值:
SELECT TO_DECIMAL('ae5', 'XXX');
该查询会返回以下输出:
+--------------------------+
| TO_DECIMAL('AE5', 'XXX') |
|--------------------------|
| 2789 |
+--------------------------+
格式元素中的位数必须大于或等于表达式中的位数。例如,尝试运行以下查询:
SELECT TO_DECIMAL('ae5', 'XX');
查询会返回错误:
100140 (22007): Can't parse 'ae5' as number with format 'XX'