カテゴリ:

変換関数

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までの、結果の数値の10進数の最大数です。Snowflakeでは、精度を使用して、数値を保存するために必要なバイト数の決定が行われず、効率に影響しないため、デフォルトは最大(38)です。

scale

小数の桁数です(0から precision -1まで)。0は、小数桁がないこと(つまり、整数)を示します。デフォルトのスケールは0です。

戻り値

関数は NUMBER(p,s) を返します。ここで、pは precision、sは scale です。

precision が指定されていない場合、デフォルトは38になります。

scale が指定されていない場合、デフォルトは0になります。

使用上の注意

  • NULL 入力の場合、結果は NULLです。

  • スケールが異なる固定小数点数は、右にゼロを追加するか(スケールを大きくする場合)、または四捨五入により小数桁の数を減らすことにより変換されます。スケールを大きくする固定から固定へのキャストには失敗する可能性があります。

  • 浮動小数点数は、スケールが与えられた表現可能な範囲内にある場合に変換されます。2進数と10進数の小数間の変換は正確ではありません。精度の損失または範囲外のエラーが発生する可能性があります。無限大および非数値は、変換エラーになります。

  • 文字列は、10進整数または小数として変換されます。

  • VARIANT 入力の場合、

    • バリアントに固定小数点または浮動小数点数値が含まれていると、適切な数値変換が実行されます。

    • バリアントに文字列が含まれていると、文字列変換が実行されます。

    • バリアントにブール値が含まれていると、結果は0または1(それぞれfalseおよびtrueに対応)になります。

    • バリアントに JSON null 値が含まれていると、出力は NULLです。

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 |
+----------+-----------------+------------------------+------------------------+

select expr, to_number(expr, 10, 9) from number_conv;

100039 (22003): Numeric value '12.3456' is out of range
Copy
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 |
+---------+-----+-----------+-----------+
Copy