TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC

TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC

TO_DECIMAL, TO_NUMBER, TO_NUMERIC의 오류 처리 버전이에요. 입력 표현식을 고정 소수점 숫자로 변환하는 같은 작업을 하지만, 변환할 수 없으면 오류 대신 NULL을 반환한다는 점이 달라요. 세 함수는 서로 동의어예요.

출처: 공식 문서

본문

TO_DECIMAL, TO_NUMBER, TO_NUMERIC의 특별한 버전으로, 입력 표현식을 고정 소수점 숫자로 변환하는 동일한 작업을 수행하지만 변환을 수행할 수 없으면 NULL을 반환하도록 오류 처리를 지원합니다. 이 함수들은 서로 동의어입니다.

자세한 내용은 Error-handling conversion functions를 참고하세요.

구문 (Syntax)

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

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

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

인자 (Arguments)

필수 (Required):

string_expr

VARCHAR 타입의 표현식입니다.

선택 (Optional):

format

입력 expr을 파싱하고 반환하는 데 사용되는 SQL 형식 모델입니다. 자세한 내용은 SQL format models를 참고하세요.

precision

결과 숫자의 최대 소수 자릿수로, 1부터 38까지입니다. Snowflake에서 precision은 숫자 저장에 필요한 바이트 수를 결정하는 데 사용되지 않으며 효율성에도 영향을 주지 않으므로 기본값은 최대값(38)입니다.

scale

분수 소수 자릿수(0부터 precision - 1까지)입니다. 0은 분수 자릿수가 없음(즉 정수)을 나타냅니다. 기본 scale은 0입니다.

반환값 (Returns)

함수는 다음 기본값을 가진 NUMBER 타입의 값을 반환합니다:

  • precision을 지정하지 않으면 38로 기본값이 설정됩니다.
  • scale을 지정하지 않으면 0으로 기본값이 설정됩니다.

변환을 수행할 수 없거나 입력이 NULL이면 NULL을 반환합니다.

사용 참고 (Usage notes)

입력은 문자열 표현식이어야 합니다.

예제 (Examples)

다음 예제는 마지막 컬럼(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');
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');
+-------------+-----+----------------+--------------------+
| 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');
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');
+-------------+------+----------------+---------------------+
| 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');
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');
+-------------+------+
| ORIG_STRING | NUM  |
|-------------+------|
| aaa         | NULL |
+-------------+------+

TO_DECIMAL 또는 TRY_TO_DECIMAL 함수와 함께 X 형식 요소를 지정하면 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');
+-------------+----------------+--------------------+
| ORIG_STRING | TO_DECIMAL_NUM | TRY_TO_DECIMAL_NUM |
|-------------+----------------+--------------------|
| aaa         |           2730 |               2730 |
+-------------+----------------+--------------------+

추가 예제는 TO_DECIMAL, TO_NUMBER, TO_NUMERIC을 참고하세요.

더 알아보기 (Learn more)