カテゴリ:

変換関数

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

引数

必須:

数値、文字、またはバリアント型の式です。

オプション:

形式

入力 を解析して返すために使用される SQL 形式モデル。詳細については、 SQL 形式モデル をご参照ください。

精度

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

スケール

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

戻り値

関数は NUMBER(p,s) を返します。pは 精度 、sは スケール です。

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

スケール が指定されていない場合、デフォルトは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
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 |
+---------+-----+-----------+-----------+