카테고리:

변환 함수

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

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

scale

소수점 이하 자릿수(0에서 precision - 1까지)입니다. 0은 소수점 이하 자릿수가 없음을 나타냅니다(즉, 정수). 기본 스케일은 0입니다.

반환

이 함수는 NUMBER(precision, scale) 을 반환합니다.

  • precision 가 지정되지 않은 경우, 38로 기본값이 지정됩니다.

  • scale 이 지정되지 않은 경우, 0으로 기본값이 지정됩니다.

사용법 노트

  • NULL 입력의 경우, 결과는 NULL입니다.

  • 고정 소수점 숫자의 경우:

    • 소수 자릿수가 다른 숫자는 오른쪽에 0을 추가하거나(소수 자릿수를 늘려야 하는 경우) 반올림으로 소수 자릿수를 줄이는(소수 자릿수를 줄여야 하는 경우) 방식으로 변환됩니다.

    • 고정 소수점 숫자를 소수 자릿수를 늘리는 고정 소수점 숫자로 강제 변환하는 작업이 실패할 수 있습니다.

  • 부동 소수점 숫자의 경우:

    • 숫자가 주어진 소수 자릿수로 표현 가능한 범위 내에 있으면 변환됩니다.

    • 이진 소수와 십진 소수 사이의 변환은 정확하지 않습니다. 이로 인해 정밀도가 떨어지거나 범위 이탈 오류가 발생할 수 있습니다.

    • 무한대 값과 NaN(숫자가 아님) 값인 경우 변환 오류가 발생합니다.

  • 문자열은 십진수, 정수, 분수 또는 부동 소수점 숫자로 변환됩니다.

    • 분수 입력의 경우 전체 자릿수는 소수점 뒤의 자릿수로 추론됩니다.

    • 부동 소수점 입력의 경우 가수 또는 지수는 생략할 수 있으며 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 함수를 사용하여 동일한 테이블에 대한 쿼리를 시도하여 precision10 이고 소수 자릿수가 9 인 숫자를 반환합니다.

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

precision 인자를 10 으로 설정하면 결과의 최대 소수 자릿수는 10입니다. 테이블의 두 값 모두 소수점 이하 자릿수가 두 자리이고 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 텍스트-최소 형식 요소가 지정된 소수 자릿수를 기준으로 소수 부분의 자릿수를 정확하게 인쇄함을 보여줍니다. 자세한 내용은 텍스트-최소 숫자 형식 섹션을 참조하십시오.

16진수 값을 10진수 값으로 변환하려면 TO_DECIMAL 함수와 함께 X 형식 요소 를 사용합니다.

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'