カテゴリ:

変換関数

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(precision, scale) を返します。

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

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

使用上の注意

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

  • 固定小数点数の場合:

    • 異なる目盛りを持つ数値は、ゼロを右に加えるか(目盛りを大きくする必要がある場合)、四捨五入によって端数桁数を減らす(目盛りを小さくする必要がある場合)ことによって変換されます。

    • 固定小数点数から固定小数点数へのキャストは、スケールが大きくなると失敗する可能性があることに注意してください。

  • 浮動小数点数の場合:

    • 数値は、スケールが与えられた表現可能な範囲内にある場合に変換されます。

    • 2進数と10進数の小数間の変換は正確ではありません。その結果、精度が落ちたり、範囲外の誤差が生じたりする可能性があります。

    • 無限大および NaN (非数値)は、変換エラーになります。

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

    • 端数入力の場合、精度は小数点以下の桁数で計算されます。

    • 浮動小数点入力の場合、仮数または指数を省略することができ、0として解釈されます。したがって、 E は0として解析されます。

  • 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