カテゴリ:

変換関数

TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC

TO_DECIMAL , TO_NUMBER , TO_NUMERIC の特別バージョンは、入力式を固定小数点数に変換する同じ操作を実行しますが、変換を実行できない場合は関数が NULL を返すエラー処理サポートがあります。

これらの関数は同義語です。

詳細については、 エラー処理変換関数 をご参照ください。

構文

TRY_TO_DECIMAL( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TRY_TO_NUMBER( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TRY_TO_NUMERIC( <string_expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
Copy

引数

必須:

string_expr

VARCHAR 型の式。

オプション:

format

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

precision

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

scale

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

戻り値

この関数は、デフォルトで型 NUMBER の値を返します。

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

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

変換を実行できないか、入力が NULLの場合は、NULLを返します。

使用上の注意

入力は文字列式にする必要があります。

最後の列(dec_with_range_error)が保持するよう要求された値を保持するのに十分な有効数字を保存しないため、この最初の例は失敗します。

SELECT column1 AS orig_string,
       TO_DECIMAL(column1) AS dec,
       TO_DECIMAL(column1, 10, 2) AS dec_with_scale,
       TO_DECIMAL(column1, 4, 2) AS dec_with_range_err
  FROM VALUES ('345.123');
Copy
100039 (22003): Numeric value '345.123' is out of range

次のクエリは前のクエリと同じですが、 TO_DECIMALではなくTRY_TO_DECIMALを使用するため、範囲外の値は NULL に変換されます。

SELECT column1 AS orig_string,
       TRY_TO_DECIMAL(column1) AS dec,
       TRY_TO_DECIMAL(column1, 10, 2) AS dec_with_scale,
       TRY_TO_DECIMAL(column1, 4, 2) AS dec_with_range_err
  FROM VALUES ('345.123');
Copy
+-------------+-----+----------------+--------------------+
| ORIG_STRING | DEC | DEC_WITH_SCALE | DEC_WITH_RANGE_ERR |
|-------------+-----+----------------+--------------------|
| 345.123     | 345 |         345.12 |               NULL |
+-------------+-----+----------------+--------------------+

次の例は、入力文字列にドル記号($)と、コンマを使用して区切られた数字のグループが含まれているため失敗します。しかし、最後の列のフォーマット指定子は、 TO_DECIMAL 関数にドル記号とコンマを期待するように指示していません。

SELECT column1 AS orig_string,
       TO_DECIMAL(column1, '$9,999.00') AS num,
       TO_DECIMAL(column1, '$9,999.00', 6, 2) AS num_with_scale,
       TO_DECIMAL(column1, 6, 2) AS num_with_format_err
  FROM VALUES ('$7,543.21');
Copy
100038 (22018): Numeric value '$7,543.21' is not recognized

次のクエリは前のクエリと同じですが、 TO_DECIMAL ではなくTRY_TO_DECIMAL を使用するため、入力は NULLに変換されます。

SELECT column1 AS orig_string,
       TRY_TO_DECIMAL(column1, '$9,999.00') AS num,
       TRY_TO_DECIMAL(column1, '$9,999.00', 6, 2) AS num_with_scale,
       TRY_TO_DECIMAL(column1, 6, 2) AS num_with_format_err
  FROM VALUES ('$7,543.21');
Copy
+-------------+------+----------------+---------------------+
| ORIG_STRING |  NUM | NUM_WITH_SCALE | NUM_WITH_FORMAT_ERR |
|-------------+------+----------------+---------------------|
| $7,543.21   | 7543 |        7543.21 |                NULL |
+-------------+------+----------------+---------------------+

次の例は、入力式に数字ではない文字が含まれているため、失敗します。

SELECT column1 AS orig_string,
       TO_DECIMAL(column1) AS num
  FROM VALUES ('aaa');
Copy
100038 (22018): Numeric value 'aaa' is not recognized

次のクエリは前のクエリと同じですが、 TO_DECIMAL ではなくTRY_TO_DECIMAL を使用するため、入力は NULLに変換されます。

SELECT column1 AS orig_string,
       TRY_TO_DECIMAL(column1) AS num
  FROM VALUES ('aaa');
Copy
+-------------+------+
| ORIG_STRING | NUM  |
|-------------+------|
| aaa         | NULL |
+-------------+------+

X形式要素を指定し、 に TO_DECIMAL または TRY_TO_DECIMAL 関数を使用して16進値を10進値に変換することで、変換を実行できます。

SELECT column1 AS orig_string,
       TO_DECIMAL(column1, 'XXX') AS to_decimal_num,
       TRY_TO_DECIMAL(column1, 'XXX') AS try_to_decimal_num
  FROM VALUES ('aaa');
Copy
+-------------+----------------+--------------------+
| ORIG_STRING | TO_DECIMAL_NUM | TRY_TO_DECIMAL_NUM |
|-------------+----------------+--------------------|
| aaa         |           2730 |               2730 |
+-------------+----------------+--------------------+

その他の例については、 TO_DECIMAL , TO_NUMBER , TO_NUMERIC をご参照ください。