- 카테고리:
TO_DECIMAL , TO_NUMBER , TO_NUMERIC¶
입력 식을 고정 소수점 숫자로 변환합니다. NULL 입력의 경우, 출력은 NULL입니다.
이러한 함수는 동의어입니다.
구문¶
TO_DECIMAL( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TO_NUMBER( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
TO_NUMERIC( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )
인자¶
필수:
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 열이 있는 테이블을 만든 다음 테이블에서 문자열 값을 검색하고 해당 값을 다른 precision
및 scale
값을 사용하여 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;
쿼리에서 반환되는 출력은 다음과 같습니다.
+----------+-----------------+------------------------+------------------------+
| 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 함수를 사용하여 동일한 테이블에 대한 쿼리를 시도하여 precision
이 10
이고 소수 자릿수가 9
인 숫자를 반환합니다.
SELECT expr, TO_NUMBER(expr, 10, 9) FROM number_conv;
precision
인자를 10
으로 설정하면 결과의 최대 소수 자릿수는 10입니다. 테이블의 두 값 모두 소수점 이하 자릿수가 두 자리이고 scale
이 9
로 설정되어 있어 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');
쿼리에서 반환되는 출력은 다음과 같습니다.
+---------+-----+-----------+-----------+
| 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');
쿼리에서 반환되는 출력은 다음과 같습니다.
+--------------------------+
| TO_DECIMAL('AE5', 'XXX') |
|--------------------------|
| 2789 |
+--------------------------+
형식 요소의 자릿수는 식의 자릿수보다 크거나 같아야 합니다. 예를 들어 다음 쿼리를 실행해 보십시오.
SELECT TO_DECIMAL('ae5', 'XX');
쿼리가 오류를 반환합니다.
100140 (22007): Can't parse 'ae5' as number with format 'XX'