카테고리:

변환 함수

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(p,s) 를 반환합니다. 여기서 p는 precision 이고 s는 scale 입니다.

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

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

사용법 노트

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

  • 스케일이 다른 고정 소수점 숫자는 오른쪽에 0을 추가하거나(스케일을 늘릴 때) 반올림으로 소수 자릿수를 줄여 변환됩니다. 스케일을 늘리는, 고정에서 고정으로의 캐스팅은 실패할 수 있습니다.

  • 부동 소수점 숫자는 스케일이 주어진 표현 가능 범위 내에 있는 경우, 변환됩니다. 2진수와 10진수 소수 간의 변환은 정확하지 않습니다. 정밀도 손실 또는 범위를 벗어남 오류가 발생할 수 있습니다. 무한대이거나 숫자가 아닌 경우, 변환 오류가 발생합니다.

  • 문자열은 10진 정수 또는 소수로 변환됩니다.

  • 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