TO_DECIMAL, TO_NUMBER, TO_NUMERIC

TO_DECIMAL, TO_NUMBER, TO_NUMERIC

TO_DECIMAL, TO_NUMBER, TO_NUMERIC 함수는 입력 표현식을 고정 소수점 숫자로 변환해요.

출처: TO_DECIMAL, TO_NUMBER, TO_NUMERIC

본문

TO_DECIMAL, TO_NUMBER, TO_NUMERIC 함수는 입력 표현식을 고정 소수점(fixed-point) 숫자로 변환해요.

이 함수들은 동의어(synonymous)예요.

함께 보기: TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC

구문 (Syntax)

TO_DECIMAL( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TO_NUMBER( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

TO_NUMERIC( <expr> [, '<format>' ] [, <precision> [, <scale> ] ] )

인자 (Arguments)

필수 (Required):

  • expr — 숫자, 문자 또는 variant 타입의 표현식이에요.

선택 (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)

  • 고정 소수점 숫자의 경우: 서로 다른 scale의 숫자는 오른쪽에 0을 추가하거나(scale을 늘려야 하는 경우) 반올림하여 소수 자릿수를 줄이는(scale을 줄여야 하는 경우) 방식으로 변환돼요. scale을 늘리는 고정 소수점에서 고정 소수점으로의 캐스트는 실패할 수 있다는 점에 주의해요.
  • 부동 소수점 숫자의 경우: 숫자가 scale이 주어졌을 때 표현 가능한 범위 내에 있으면 변환돼요. 이진 소수 숫자와 십진 소수 숫자 사이의 변환은 정확하지 않아요. 이로 인해 정밀도 손실 또는 범위를 벗어난 오류가 발생할 수 있어요. 무한대와 NaN(숫자 아님) 값은 변환 오류를 발생시켜요.
  • 문자열은 십진수, 정수, 분수 또는 부동 소수점 숫자로 변환돼요. 분수 입력의 경우 precision은 소수점 뒤의 자릿수로 추론돼요. 부동 소수점 입력의 경우 가수(mantissa) 또는 지수(exponent) 생략이 허용되며 0으로 해석돼요. 따라서 E는 0으로 파싱돼요.
  • VARIANT 입력의 경우: variant가 고정 소수점 또는 부동 소수점 숫자 값을 포함하면 적절한 숫자 변환이 수행돼요. variant가 문자열을 포함하면 문자열 변환이 수행돼요. variant가 Boolean 값을 포함하면 결과는 0 또는 1이에요(false와 true에 각각 대응). variant가 JSON null 값을 포함하면 출력은 NULL이에요.

예제 (Examples)

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이고 scale이 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 함수와 함께 다른 format elements를 사용해요:

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 텍스트 최소 형식 요소가 지정된 scale을 기준으로 소수 부분의 자릿수를 정확히 출력한다는 것을 보여줘요. 자세한 내용은 Text-minimal numeric formats를 참조해요.

쉼표를 사용해 자릿수 그룹을 구분하는 숫자를 변환해요:

SELECT column1,
       TO_DECIMAL(column1, '9,999.99', 6, 2) as convert_number
  FROM VALUES ('3,741.72');

쿼리는 다음 출력을 반환해요:

+----------+----------------+
| COLUMN1  | CONVERT_NUMBER |
|----------+----------------|
| 3,741.72 |        3741.72 |
+----------+----------------+

쉼표를 사용해 자릿수 그룹을 구분하는 통화 값을 변환해요:

SELECT column1,
       TO_DECIMAL(column1, '$9,999.99', 6, 2) as convert_currency
  FROM VALUES ('$3,741.72');

쿼리는 다음 출력을 반환해요:

+-----------+------------------+
| COLUMN1   | CONVERT_CURRENCY |
|-----------+------------------|
| $3,741.72 |          3741.72 |
+-----------+------------------+

TO_DECIMAL 함수와 함께 X 형식 요소를 사용해 16진수 값을 10진수 값으로 변환해요:

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'

더 알아보기 (Learn more)

  • TRY_TO_DECIMAL, TRY_TO_NUMBER, TRY_TO_NUMERIC
  • 변환 함수 (Conversion functions)
  • SQL format models