カテゴリ:

変換関数

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 です。

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 関数を使用して、 10precision9 のスケールを持つ数値を返すクエリを試します。

SELECT expr, TO_NUMBER(expr, 10, 9) FROM number_conv;
Copy

precision 引数を 10 に設定すると、結果の小数点以下の桁数の最大値は10になります。テーブルの値はどちらも小数点の前に2桁あり、 scale9 に設定されているため、結果は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 text-minimal format要素が、指定されたスケールに基づき、小数部の桁数を正確に印字することを示しています。詳細については、 テキスト最小の数値形式 をご参照ください。

16進数値を10進数値に変換するには、 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'